在自定义 Racket 语言中,如何定义递归宏?



我正在尝试用自定义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))

最新更新