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

4 lisp null loops for-loop list

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

我创建了func:

(defun make (id name surname) (list :id id :name name :surname surname) )
Run Code Online (Sandbox Code Playgroud)

在这里我创建了全局变量:

(defvar *db* nil)
Run Code Online (Sandbox Code Playgroud)

在这里我定义了func,用于添加每个新值以将其存储在db中:

(defun add (cd) (push cd *db*))
Run Code Online (Sandbox Code Playgroud)

所以,我能够将每个新数据添加到db,如下所示:

(add (make 0 "Oleg" "Orlov" ) )
Run Code Online (Sandbox Code Playgroud)

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

*db*
Run Code Online (Sandbox Code Playgroud)

所以,我想知道如何使用"for"循环将每个新记录列表放到db中,我在lisp中的"for"循环中打印值,如下所示:

 (loop for i from 1 to 10 do ( ... ))
Run Code Online (Sandbox Code Playgroud)

如果,我使用:

 (loop for i from 0 to 10 do (add (make i "Oleg" "Orlov") ) )
Run Code Online (Sandbox Code Playgroud)

如果您阅读db,*db*您会看到所有evelen记录都已添加,但在调用最后一行后,您将获得NIL结果.

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

谢谢,最好的问候!

Ina*_*thi 5

Lisp中的每个表单都会评估某些内容.

如果您键入的表单未返回值,则NIL默认情况下将评估为(否则,将计算其返回的值).你的循环实际上并没有返回一个值; 它只执行10个赋值(每个中间表达式都返回一个值,但是你不收集并返回它们).因此,该代码将返回NIL.

如果您还没有这样做,请查看Practical Common Lisp的第3章,其中Peter Seibel逐步创建一个简单的数据库.它可能会让您对Lisp如何工作的基础知识有所了解.您询问的具体问题(为什么表单NIL默认返回,以及它在Common Lisp的上下文中具体含义)在同一本书的第2章中得到了解答

至于如何明确地使您loop发出它添加的项目列表*db*,请尝试以下操作

(loop for i from 1 to 10
      for elem = (make i "Oleg" "Orlov")
      do (add elem)
      collect elem)
Run Code Online (Sandbox Code Playgroud)