[英]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.