计划和设置!

Hel*_*nar 2 lisp variables scheme

如何通过消耗lambda参数的函数更改变量的值?即:

;;definitions
(define test "fails")
(define (experiment input) (set! input "works"))

;;interactions
> test
"fails"
> (experiment test)
> test
"fails"
Run Code Online (Sandbox Code Playgroud)

这似乎失败了......

问候

Eli*_*lay 9

你不能 - 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-syntaxsyntax-rules用于所述第二]