在Racket中如何替代R6RS的syntax-violation函数?
问题
根据DrRacket文档,syntax-violation定义在rnrs/syntax-case-6中。但我希望使用racket/base里的syntax-case,不想导入rnrs/syntax-case-6(以及整个R6RS,因为它的syntax-case实现和racket/base的不一致)。想问racket/base或racket/racket中有没有可替代syntax-violation的函数?还是我需要自行编写一个抛出异常的版本?
——补充说明——
我尝试从racket/base导入syntax-violation,发现该函数不存在:
racket Welcome to Racket v8.6 [cs]. > syntax-violation syntax-violation: undefined; cannot reference an identifier before its definition in module: top-level [,bt for context] > (require racket/base) > syntax-violation syntax-violation: undefined; cannot reference an identifier before its definition in module: top-level [,bt for context] > (syntax-violation #f "error message" #f) syntax-violation: undefined; cannot reference an identifier before its definition in module: top-level [,bt for context]
解决方案
在Racket的标准库中,racket/base确实没有内置的syntax-violation函数,你可以通过以下两种方式解决:
使用
raise-syntax-error函数racket/base提供了raise-syntax-error,它的作用与syntax-violation一致,用于抛出语法相关错误,且参数兼容。示例用法:(raise-syntax-error #f "错误消息" #f)该函数在
racket/base中默认可用,无需额外导入。自行封装
syntax-violation
若习惯使用syntax-violation的命名,可以基于raise-syntax-error封装一个同名函数:(define (syntax-violation who msg stx . irritants) (apply raise-syntax-error who msg stx irritants))这样就能沿用
syntax-violation的调用方式,同时完全基于racket/base实现。
内容的提问来源于stack exchange,提问作者thor
相关产品推荐
相关产品推荐

