【发布时间】:2019-09-16 23:54:03
【问题描述】:
我正在尝试使用自定义 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) 不匹配和扩展?
【问题讨论】: