更改方案/球拍中lambda之外的变量
Racket文档中的示例随更改方案/球拍中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
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
之类的东西。