2012-01-21 7 views
4

Lisp、 "for"ループでdbに新しいリストを追加する、なぜNILを返すの?

私は、関数を呼び出すたびに作成される新しいリストの "for"ループから新しい値をそれぞれLISPでどのように印刷することができますか?

私はFUNCを作成しました:
ここ

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

私はグローバル変数を作成しました:私はデシベルでそれを格納するために、それぞれの新しい値を追加するためのFUNCを定義し

(defvar *db* nil) 

そしてここに:

したがって、 Iそのように、DBへのそれぞれの新しいデータを追加することができるよ:私は使用することができ、私のデシベルのコンテンツを検索するには

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


*db* 

だから、私は置く方法を疑問に思いますそれぞれの新しいレコードのリストがループ「のために」を使用してDBへ、私はこのようなLispでループ「のために」の値を出力します。

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

がいる場合は、私が使用:

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

すべてevelenレコードが追加されたことを、あなたが表示されます*db*を使用しますが、最後の行を呼び出した後のDB Read場合は、見返りにNIL結果を取得します。

なぜNIL結果を取得するのですか?Tとは何を意味しますか?

ありがとうございます。

答えて

5

Lispの各フォームは何かを評価します。

入力したフォームが値を返さない場合は、デフォルトでNILと評価されます(そうでない場合は、返される値に評価されます)。ループは実際には値自体を返しません。 10個の代入を実行するだけです(各中間式は値を返しますが、それらを収集して返しません)。したがって、そのコードはNILを返します。

まだ完了していない場合は、chapter 3 of Practical Common Lispをチェックしてください。ここでPeter Seibelは簡単なデータベースの作成を段階的に行っています。 Lispがどのように動作するかについての基礎をいくつか紹介します。具体的な質問(フォームはデフォルトでNILを返し、それはCommon Lispのの文脈の中で、特に何を意味するのか、なぜ)あなたが尋ねるがためとして、あなたが明示的にそれが追加されたアイテムのリストを発するようにあなたのloopを引き起こすだろうか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) 
関連する問題