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

更改方案/球拍中lambda之外的变量,lambda,syntax,macros,scheme,racket,Lambda,Syntax,Macros,Scheme,Racket,Racket文档中的示例随lambda始终提供: 我的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-synta

Racket文档中的示例随
lambda
始终提供:

我的
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之外更改这些变量呢

这里有一个相关的答案:
但是它是关于不推荐的
定义宏
()

宏可以扩展到任何东西,而不仅仅是
lambda

#lang racket

(require syntax/parse/define)

(define-simple-macro (sp x:id) (set! x (add1 x)))

(define a 0)
(sp a)
(display a)
或者如果您更喜欢使用
定义语法分析器

#lang racket

(require syntax/parse/define)

(define-syntax-parser sp
  [(_ x:id) #'(set! x (add1 x))])

(define a 0)
(sp a)
(display a)

tks,从那个邪恶的lambda救了我:)定义简单宏和定义语法规则有何不同?它们的外观和功能基本相同,只是
define simple macro
支持
syntax parse
功能。像
{~datum…}
或语法类
:id
之类的东西。