2011-11-12 8 views
4

私は共通リスプに関するチュートリアルを進めてきましたが、私はちょうどincfdolistに紹介されました。リストのすべての要素を増やす関数inc-listを作成することで、 1によって:(dolist(要素リスト)...)の 'element'用語は何を意味しますか?

(defvar a-list (list 1 2 3))

ここ

(inc-list a-list) => (2 3 4)

は、私はINC-リストを定義した方法です

(defun inc-list (list) 
    (progn 
    (dolist (element list) 
     (incf element)) 
    list)) 

これは機能していないようです。私がしようとすると(inc-list a-list)私は(1 2 3)a-list => (1 2 3)を返す。それはやっているという事実のためでなかった場合、これは私が多くを気にしないでしょう。

(incf (car a-list)) 
(incf (cadr a-list)) 
(incf (caddr a-list)) 

は私にa-list => (2 3 4)を与えます。 elementは何の秘密がありますか?

答えて

4

elementは、リストの各要素にバインドされており、つまり、各ペアのcarの値はある意味で「コピー」されています。次にincfelementで呼び出され、その変数の値がで、がインクリメントされますが、から取られたリストの位置ではなく、ではありません。それが新しい値にsetq D」ですので、あなたが

(defvar element (car a-list)) 
(incf element) 
(setq element (cadr a-list)) 
(incf element) 
(setq element (caddr a-list)) 
(incf element) 
あまりにもここで

をやっているかのようにです、elementはたびに増加し、その後すぐに「忘れられた」されます。対照的に、(incf (car a-list))は、をa-listで増やします。です。あなたがループ内でその行動をしたい場合は、代わりにおよそdolistloop onリストを忘れて:

(loop for position on lst 
     do (incf (car position))) 
2
(defvar a-list (list 1 2 3)) 

サイドノート:このようなグローバル変数を記述しないでください。 *a-list*と書いてください。それ以外の場合は、グローバル動的変数がローカル変数に影響します。

(defun inc-list (list) 
    (progn 
    (dolist (element list) 
     (incf element)) 
    list)) 

PROGNは必要ありません。 DEFUNはすでにDOLISTのように一連のフォームを許可しています。

(defun inc-list (list) 
    (dolist (element list) 
    (incf element)) 
    list) 

以上で十分です。

DOLISTELEMENTと呼ばれる新しい(!)のローカル変数を紹介する形式です。

DOLISTは、各繰り返しでELEMENTの値を設定します。 各繰り返しステップでは、ELEMENTの値を増やしてください。 あなたの副作用は失われます。元のリストは変更されません。それ以外の場合はELEMENTの値は使用されません。

関連する問題