Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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
Functional programming 计划环境中的破坏性操作_Functional Programming_Scheme_Evaluation_Destruction - Fatal编程技术网

Functional programming 计划环境中的破坏性操作

Functional programming 计划环境中的破坏性操作,functional-programming,scheme,evaluation,destruction,Functional Programming,Scheme,Evaluation,Destruction,我对计划中的破坏性行动感到困惑。比如说,我有一个清单和一些在全球环境中定义的破坏性程序: (define a '(a b c)) (define (mutate-obj x) (set! x '(mutated))) (define (mutate-car! x) (set-car! x 'mutated)) (define (mutate-cdr! x) (set-cdr! x 'mutated)) 然后我们有以下表达式: (mutate-obj! a) a =>

我对计划中的破坏性行动感到困惑。比如说,我有一个清单和一些在全球环境中定义的破坏性程序:

(define a '(a b c))
(define (mutate-obj x)
    (set! x '(mutated)))
(define (mutate-car! x)
    (set-car! x 'mutated))
(define (mutate-cdr! x)
    (set-cdr! x 'mutated))
然后我们有以下表达式:

(mutate-obj! a) a => (a b c)
(mutate-car! a) a => (mutated b c)
(mutate-cdr! a) a => (mutated . mutated)

为什么没有设定!当两者都设置为car时,对程序外的车辆产生影响!设置cdr!有为什么第一行上的表达式没有计算为变异?所有这些到底是如何工作的?

第一个示例并没有像您想象的那样工作。尽管x参数和a全局变量都指向同一个列表,但在执行set时!x'突变您只需将x设置为过程的本地参数,以指向不同的列表,而a保持不变。如果你写下这样的话,情况会有所不同:

(define (mutate-obj)
  (set! a '(mutated)))
现在a在过程中发生了变异。第二个和第三个过程正在修改a列表的内容,该列表也由x表示,所以一旦过程返回,更改将反映在外部。

Ok,但如何设置car!设置cdr!从a到x变异?