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

In a custom Racket language, how can I define a recursive macro?

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