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