gpt4 book ai didi

scheme - 为什么要定车!像这样实现不起作用

转载 作者:行者123 更新时间:2023-12-01 09:59:27 25 4
gpt4 key购买 nike

在Racket中,没有set-car!函数,我想这样实现:

(define myset-car!
(lambda (list value)
(if (not (list? list))
#f
(set! list (cons value (cdr list))))))

但它不起作用,如果我这样使用它,它不能改变列表的值:

 (define p (list 2 3 4))
(myset-car! p 'a)
p ; p still is (2 3 4)

谁能告诉我为什么?我做的有什么问题吗?

最佳答案

问题中的代码不起作用,因为在这一行中:

(set! list (cons value (cdr list)))

...您正在为 list parameter 分配一个新值,但这是过程的局部更改,不会反射(reflect)在“外部” p 变量中的过程。您只是将 list 参数指向另一个列表,但是一旦过程返回,p 仍指向原始列表。

事实上,set-car! 必须是一个原始操作。但不要担心,在 Racket 中 set-mcar! 和一堆其他可变对的操作,如果未绑定(bind),您只需导入 mpair :

(require scheme/mpair)

并始终如一地使用所有可变对操作。例如,以下是构建可变列表的方法:

(define mlst (mcons 1 (mcons 2 (mcons 3 '()))))

或者:

(define mlst (mlist 1 2 3))

访问元素:

(mcar mlst)
=> 1

(mcdr mlst)
=> (mcons 2 (mcons 3 '()))

当然,要改变元素:

(set-mcar! mlst 0)
mlst
=> (mcons 0 (mcons 2 (mcons 3 '())))

(set-mcdr! mlst '())
mlst
=> (mcons 0 '())

关于scheme - 为什么要定车!像这样实现不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18514421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com