lambda - 在 Scheme/Racket 中更改 lambda 之外的变量
问题描述
lambda
Racket 文档中的示例始终附带: 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-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)
推荐阅读
- java - 使用java替换zip文件中的特定文件
- java - 错误消息后将 inputText 值恢复为以前的值
- c++ - 将消息中的泛型传递给事件侦听器的正确设计
- c# - 实体框架只包含返回部分数据库数据
- c# - 防止 Simple.OData.Client 获取整个结构
- python - Python-GNUPG 加密文件无法用私钥解密
- python - 我的一个轴的所有值都没有显示(只有其中一些显示在图表上)并且我在 python 中得到了一个错误的图表
- python - Python:获取所有可能的组合,用于将 x 个苹果分配给 y 个受约束的篮子
- javascript - 循环不会搜索整个对象数组?
- python - 类实例化在 python 中给出位置错误