gpt4 book ai didi

list - 使用 lisp 将变量附加到列表列表

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

我有一个定义如下的列表:

(defparameter testlist '(((a b) (c d)) ((e f) (g h ))) )

我还有一个变量定义为:

(defparameter feature 'u)

我想向 (c d) 添加一个功能。

当我尝试时:

(setf (nth 1 (nth 0 testlist)) (append (nth 1 (nth 0 testlist)) feature)) 

teSTList 变成:

(((A B) (C D . U)) ((E F) (G H)))

但是,我想要一个非虚线列表。

我不明白为什么我会得到这个结果。您能否解释原因或建议一种更好的追加方法,这对于初学者来说是可以理解的?

最佳答案

首先,您的特征 不是列表。 append 允许最后一个参数是任何东西,但是如果最后一个元素本身不是一个正确的列表,那么结果将不是一个正确的列表。因此:

(append '(1 2) 3)        ; ==> (1 2 . 3)
(append '(1 2) '(3 . 4)) ; ==> (1 2 3 . 4)
(append '(1 2) '(3 4)) ; ==> (1 2 3 4)

因此,如果您希望 feature 成为您要替换的列表中的一个元素,而不是新的点值,则需要附加 (list feature)

您需要找到要更改的列表以及需要重新创建之前的所有内容,但之后的所有内容都可以与原始来源共享:

查看您想要更改 cadar 的结构,同时您需要重新创建 caar 而结果可以共享 cdr:

(let ((lst '(((a b) (c d)) ((e f) (g h )))) (feature 'x))
(list* (list (caar lst) (append (cadar lst) (list feature))) (cdr lst)))
; ==> (((a b) (c d x)) ((e f) (g h)))

现在您选择如何使用该结果取决于您。您可以setf 绑定(bind),除了不想要的后果外,您将拥有与变异相同的行为。

关于list - 使用 lisp 将变量附加到列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39691673/

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