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

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

;;interactions
> test
"fails"
> (experiment test)
> test
"fails"

这似乎失败了。。
当做

最佳答案

您不能--Scheme“按值”传递所有值,因此在上面的experiment函数中只需修改它自己的输入参数要使类似的工作正常进行,可以使用box,它是一个显式可变的值容器:

(define test (box "fails"))
(define (experiment input) (set-box! input "works"))
(unbox test)
(experiment test)
(unbox test)

如果确实要更改变量的值,可以使用宏:
(define-syntax-rule (experiment input) (set! input "works"))

这会将experiment创建为宏,这意味着每个(experiment foo)表单都将被重写为(set! foo "works")这可能会产生微妙的后果,所以除非你知道自己在做什么,否则使用它不是一个好主意(例如,(experiment 2)将以一种“有趣”的方式失败)在Scheme中编写宏很容易,但是编写好的宏仍然比编写新的函数定义困难。
[请注意,我假设您在这个答案中使用PLT方案但如果需要,这两部分都可以转换为“标准”方案——例如,第一部分使用可变的cons单元格,第二部分使用define-syntaxsyntax-rules单元格。]

关于variables - 计划和设置!,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1707728/

10-12 23:04