首页 > 解决方案 > 在 Scheme/Racket 中更改 lambda 之外的变量

问题描述

lambdaRacket 文档中的示例始终附带: 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-macrohttps://docs.racket-lang.org/compatibility/defmacro.html

标签: lambdasyntaxmacrosschemeracket

解决方案


宏可以扩展到任何东西,而不仅仅是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)

推荐阅读