来自Racket文档的示例始终与lambda
一起提供:https://docs.racket-lang.org/syntax/Defining_Simple_Macros.html
而且我的define-syntax-parser
是这样的:
(require syntax/parse/define)
(define-syntax-parser sp
[_ #'(lambda (x) (set! x (add1 x)))]
)
(define a 0)
((sp) a)
(display a)
可能做这样的事情(删除lambda
)?
(require syntax/parse/define)
(define-syntax-parser sp
[(f x)_ #'(set! x (add1 x))]
)
(define a 0)
(f a)
(display a)
结果应为1
,但仍为0
。而且Scheme / Racket不会通过引用传递(?!),那么如何在lambda之外更改这些变量?
这里有一个相关的答案:https://stackoverflow.com/a/8998055/5581893但这是关于已弃用的define-macro
(https://docs.racket-lang.org/compatibility/defmacro.html)
宏可以扩展到所有内容,而不仅仅是lambda
。
#lang racket
(require syntax/parse/define)
(define-simple-macro (sp x:id) (set! x (add1 x)))
(define a 0)
(sp a)
(display a)
或者,如果您想使用define-syntax-parser
:
#lang racket
(require syntax/parse/define)
(define-syntax-parser sp
[(_ x:id) #'(set! x (add1 x))])
(define a 0)
(sp a)
(display a)