gpt4 book ai didi

Lisp 关联列表错误

转载 作者:太空宇宙 更新时间:2023-11-03 19:00:21 25 4
gpt4 key购买 nike

我编写了将 cons 单元格插入关联列表的代码。比如有关联表

((1 . a) (3 . c) (4 . d))

我想插入 cons 单元 (2 . b) 然后这个程序产生

((1  a) (2 . b) (3 . c) (4 . d))

但是我的代码引发了一个异常

(car L) should be a lambda expression

下面是我的代码

(defun INSERTCELL (R L)
(cond ((< (car L) (car R)) cons((car L) INSERTCELL(R (cdr L))))
(t cons(R L))))

R(2 . b)L((1 . a) (3 . c) ( 4 . d)) 所以 R 应该被插入到 L 中。

最佳答案

SDS's answer处理代码中的排版问题以及其他一些错误。也就是说,我认为值得注意的是可能还有其他方法可以做到这一点。首先,关联列表不必按顺序存储。如果您不需要按顺序排列,那么您可以简单地使用 acons将新元素添加到开头:

(let ((alist '((1 . a) (3 . c) (4 . d))))
(acons 2 'b alist))
;=> ((2 . B) (1 . A) (3 . C) (4 . D))

如果您确实需要维护排序条件,一种选择是使用上述方法,然后 sort之后的列表。不过,这可能有点矫枉过正,因为您已经知道关联列表已排序,您只需要将新元素放在它的位置即可。为此,您可以使用内置的 merge合并关联列表和新元素的函数(通过将其包装在列表中,因此它是一个元素的关联列表):

(let ((alist (copy-list '((1 . a) (3 . c) (4 . d))))
(new (list (cons 2 'b))))
(merge 'list alist new '< :key 'car))
;=> ((1 . A) (2 . B) (3 . C) (4 . D))

(let ((alist '((1 . a) (3 . c) (4 . d))))
(merge 'list (copy-list alist) (copy-list '((2 . b)))
'< :key 'car))
;=> ((1 . A) (2 . B) (3 . C) (4 . D))

注意 merge 是破坏性的(也就是说,它可以修改它的参数),这就是为什么我在这里使用 copy-list 来获取新数据。在您的情况下,由于您可能正在逐步构建列表,所以它可能没问题,只要您保存结果。例如,

(defun insert-cell (key value alist)
(merge 'list alist (list (cons key value))
'< :key 'car))
(let ((alist '()))
(setf alist (insert-cell 1 'a alist))
(setf alist (insert-cell 4 'd alist))
(setf alist (insert-cell 3 'c alist))
(setf alist (insert-cell 2 'b alist))
alist)
;=> ((1 . A) (2 . B) (3 . C) (4 . D))

关于Lisp 关联列表错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36457071/

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