gpt4 book ai didi

reference - 如何区分常量列表和动态创建的列表?

转载 作者:行者123 更新时间:2023-12-04 05:58:57 27 4
gpt4 key购买 nike

我是学生,明天考试,看到去年有这个问题:写一个区分'(a b)的方案代码来自 (list 'a 'b) , 不使用副作用(没有 set! , set-car! ..)
我不知道该怎么做。有人有什么想法吗?

之所以有差异,是因为'(a b)在内存中创建一个静态对象,即被引用。和 (list 'a 'b)是一个创建动态内存对象的应用程序。

我的老师期待的代码要么根据输入给出不同的答案,要么一个输入导致无限循环。

使用副作用的代码示例:

(define lst (lambda () '(a b)))
(set-car! (lst) 'g)
(display (lst)) (newline)
;;; prints (g b)

(define lst1 (lambda () (list 'a 'b)))
(set-car! (lst1) 'g)
(display (lst1)) (newline)
;;; prints (a b)

原因是 lambda正在推迟值的计算,并在 (list 'a 'b) 的情况下导致每次创建一个新列表 (lst1)叫做。

对于那些提示这个问题不好的人:类(class)是关于编译器的,他希望我们了解在代码生成之前一切都有什么影响。

最佳答案

可以通过内存位置区分对象的问题有一个假设。见 Equivalence Predicates在 6.1 节,特别是对 的描述等式? .

具体来说:

(define x '(a b))
(define y (list 'a 'b))

(eqv? x y)
(eqv? y x)
(eqv? x x)
(eqv? y y)

都有明确的值(value)观。

正如你所注意到的,
(eqv? '(a b) '(a b))

是特定于实现的。如果你的考题是问在未定义的情况下会发生什么,我很想回答“Foo”。 :) 没有更多的上下文,这是一个无意义的问题。

另一方面,
(eqv? (list 'a 'b) (list 'a 'b))

定义明确。

关于reference - 如何区分常量列表和动态创建的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9162280/

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