我正在尝试用自定义Racket语言创建一个递归宏。 但是,虽然宏使用#lang racket
正确扩展,但在使用我的新语言实现时它会失败。
例如,下面是一个简单的宏f
的递归定义,它扩展到其最后一个参数:
;; my-lang.rkt
#lang racket
(provide #%datum
#%module-begin
define-syntax
(for-syntax syntax-case
syntax
raise-syntax-error
#%app
quote
#%datum))
#lang s-exp "my-lang.rkt"
(define-syntax (f stx)
(syntax-case stx ()
[(_ x) #'x]
[(_ x xs ...) #'(f xs ...)]
[_ (raise-syntax-error 'f "bad syntax" stx)]))
(f 1 2 3) ; => f: bad syntax in: (f 2 3)
为什么(f 2 3)
不匹配和扩展?
将...
添加到提供的标识符中。
#lang racket
(provide #%datum
#%module-begin
define-syntax
(for-syntax syntax-case
syntax
raise-syntax-error
#%app
quote
quote-syntax
...
#%datum))