Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 计划和设置!_Variables_Lisp_Scheme - Fatal编程技术网

Variables 计划和设置!

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) 如果确实要更改变

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

这似乎失败了

关于

您不能--Scheme“按值”传递所有值,因此在上面的
实验中
函数只是修改自己的输入参数。要使类似的功能正常工作,可以使用一个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'