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变异?