在 Scheme/Racket 中更改 lambda 之外的变量
Change variable outside of lambda in Scheme/Racket
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 之外更改这些变量?
这里有一个相关的答案:
但这是关于已弃用的 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)
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 之外更改这些变量?
这里有一个相关的答案:
但这是关于已弃用的 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)