簡體   English   中英

Lisp,在“for”循環中向db添加新列表,為什么返回NIL?

[英]Lisp, add new list to db in “for” loop, why returning NIL?

我想知道,如何在LISP中打印新列表中的循環“for”中的每個新值,每次通過調用函數創建。

我創建了func:

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

在這里我創建了全局變量:

(defvar *db* nil)

在這里我定義了func,用於添加每個新值以將其存儲在db中:

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

所以,我能夠將每個新數據添加到db,如下所示:

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

要查看我的數據庫的內容,我可以使用:

*db*

所以,我想知道如何使用“for”循環將每個新記錄列表放到db中,我在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

如果您還沒有這樣做,請查看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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM