gpt4 book ai didi

lisp - Lisp 中的赋值

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

我在 Common Lisp 中有以下设置。 my-object 是 5 个二叉树的列表。

(defun make-my-object ()
(loop for i from 0 to 5
for nde = (init-tree)
collect nde))

每个二叉树都是一个大小为 3 的列表,带有一个节点、一个左 child 和一个右 child

(defstruct node
(min 0)
(max 0)
(ctr 0))

(defun vals (tree)
(car tree))

(defun left-branch (tree)
(cadr tree))

(defun right-branch (tree)
(caddr tree))

(defun make-tree (vals left right)
(list vals left right))

(defun init-tree (&key (min 0) (max 1))
(let ((n (make-node :min min :max max)))
(make-tree n '() '())))

现在,我试图手动将一个元素添加到其中一个二叉树中,如下所示:

(defparameter my-object (make-my-object))
(print (left-branch (car my-object))) ;; returns NIL
(let ((x (left-branch (car my-object))))
(setf x (cons (init-tree) x)))
(print (left-branch (car my-object))) ;; still returns NIL

第二次调用 print 仍然返回 NIL。为什么是这样?如何向二叉树添加元素?

最佳答案

第一个函数就是:

(defun make-my-object ()
(loop repeat 5 collect (init-tree)))

现在您为 node 定义了一个结构,但是您为 treemy-object 使用了一个列表?为什么它们不是结构体?

代替 carcadrcaddr 可以使用 firstsecond第三个

(let ((x (left-branch (car my-object))))
(setf x (cons (init-tree) x)))

您将局部变量 x 设置为一个新值。为什么?在 let 之后,局部变量也消失了。你为什么不设置左分支呢?您需要定义一种方法来这样做。请记住:Lisp 函数返回值,而不是您可以稍后设置的内存位置。如何更改列表中的内容?更好的是:使用结构并更改插槽值。该结构(甚至 CLOS 类)与普通列表相比具有以下优点:对象带有类型、槽被命名、访问器被创建、make 函数被创建、类型谓词被创建、...

无论如何,我会为节点、树和对象定义结构或 CLOS 类...

关于lisp - Lisp 中的赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33188001/

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