更改方案/球拍中的lambda之外的变量

问题描述 投票:1回答:1

来自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-macrohttps://docs.racket-lang.org/compatibility/defmacro.html

lambda syntax macros scheme racket
1个回答
0
投票

宏可以扩展到所有内容,而不仅仅是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)
© www.soinside.com 2019 - 2024. All rights reserved.