Variables 计划和设置!
如何通过使用lambda参数的函数更改变量的值? 即: 这似乎失败了 关于您不能--Scheme“按值”传递所有值,因此在上面的Variables 计划和设置!,variables,lisp,scheme,Variables,Lisp,Scheme,如何通过使用lambda参数的函数更改变量的值? 即: 这似乎失败了 关于您不能--Scheme“按值”传递所有值,因此在上面的实验中函数只是修改自己的输入参数。要使类似的功能正常工作,可以使用一个box,它是一个显式可变值容器: (define test (box "fails")) (define (experiment input) (set-box! input "works")) (unbox test) (experiment test) (unbox test) 如果确实要更改变
实验中
函数只是修改自己的输入参数。要使类似的功能正常工作,可以使用一个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"))
这将实验创建为宏,这意味着每个(实验foo)
表单都将被重写为(set!foo“works”)
。这可能会产生微妙的后果,所以除非你知道自己在做什么,否则使用它不是一个好主意。(例如,(实验2)
将以“有趣”的方式失败。)在Scheme中编写宏很容易,但编写好的宏仍然比编写新的函数定义更困难
[请注意,我假设您在这个答案中使用的是PLT方案。但如果需要,这两部分都可以转换为“标准”方案——例如,第一部分使用可变的cons
单元格,第二部分使用定义语法
和语法规则
。]如果你在Python中考虑相同的代码:,它可能会更有意义。
test = "fails"
def experiment(input):
input = "works"
>>> test
'fails'
>>> experiment(test)
>>> test
'fails'
这也可以通过参数实现:是的,参数是另一种可变类型的容器(PLT还有多个容器,如线程单元
)。但它们的语义可能与普通的全局语言略有不同。例如,一个参数对于每个线程都有一个唯一的值(更确切地说,对于每个延续都有一个唯一的值)。这是如何回答这个问题的?
test = "fails"
def experiment(input):
input = "works"
>>> test
'fails'
>>> experiment(test)
>>> test
'fails'