gpt4 book ai didi

list - Lisp,在 "for"循环中向 db 添加新列表,为什么返回 NIL?

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

我想知道,我如何在 LISP 中打印新列表中循环“for”的每个新值,每次都通过调用函数创建。

我已经创建了函数:

(defun make (id name surname) (list :id id :name name :surname surname) )

这里我创建了全局变量:

(defvar *db* nil)

在这里我定义了添加每个新值的函数以将其存储在数据库中:

(defun add (cd) (push cd *db*))

因此,我可以将每个新数据添加到数据库中,就像这样:

(add (make 0 "Oleg" "Orlov" ) )

要查看我的数据库的内容,我可以使用:

*db*

所以,我想知道如何使用“for”循环将每个新记录列表放入数据库,我在 lisp 中打印“for”循环中的值,如下所示:

 (loop for i from 1 to 10 do ( ... ))

如果 ,我使用:

 (loop for i from 0 to 10 do (add (make i "Oleg" "Orlov") ) )

如果你使用 *db* 读取数据库,你会看到,所有的 evelen 记录都被添加了,但是在调用最后一行之后,你将得到 NIL 结果返回。

为什么我捕获的是 NIL 结果,而不是 T,这是什么意思?

谢谢,最好的问候!

最佳答案

Lisp 中的每个形式都会计算出某种东西。

如果您输入的表单没有返回值,默认情况下它将计算为 NIL(否则,它计算为它返回的值)。您的循环本身实际上并不返回值;它只执行 10 次赋值(每个中间表达式确实返回一个值,但您不收集并返回它们)。因此,该代码将返回 NIL

如果您还没有这样做,请查看 chapter 3 of Practical Common Lisp ,其中 Peter Seibel 逐步创建了一个简单的数据库。它可能会让您深入了解 Lisp 的工作原理。您提出的具体问题(为什么表单默认返回 NIL,以及它在 Common Lisp 上下文中的具体含义)在 chapter 2 of the same book 中得到了回答。

至于如何显式地使您的循环发出它添加到*db* 的项目列表,请尝试以下操作

(loop for i from 1 to 10
for elem = (make i "Oleg" "Orlov")
do (add elem)
collect elem)

关于list - Lisp,在 "for"循环中向 db 添加新列表,为什么返回 NIL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8956943/

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