你不能 - Scheme"按值"传递所有值,所以在上面这个experiment函数只是修改它自己的输入参数.要使这样的工作正常工作,您可以使用一个框,它是一个显式可变的值容器:
(define test (box "fails"))
(define (experiment input) (set-box! input "works"))
(unbox test)
(experiment test)
(unbox test)
Run Code Online (Sandbox Code Playgroud)
如果您确实想要更改变量的值,可以使用宏:
(define-syntax-rule (experiment input) (set! input "works"))
Run Code Online (Sandbox Code Playgroud)
这创建experiment为一个宏,这意味着每个(experiment foo)表单都被重写(set! foo "works").这可能会产生微妙的后果,因此除非您知道自己在做什么,否则使用它并不是一个好主意.(例如,(experiment 2)将以"有趣"的方式失败.)在Scheme中编写宏很容易,但编写好的宏仍然比编写新的函数定义更困难.
[请注意,我假设你在这个答案中使用PLT Scheme.但两个零件可被翻译成如果需要的话"标准"方案-例如,使用一个可变的cons细胞用于第一,并使用define-syntax与syntax-rules用于所述第二]
| 归档时间: |
|
| 查看次数: |
1886 次 |
| 最近记录: |