如何通过使用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-syntax
和syntax-rules
单元格。]关于variables - 计划和设置!,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1707728/