2017-07-29 2 views
0

dotimesのLispWorks Hyperspecを見ていますが、第3の変数[result-form]が何をしているのか分かりません。次のような例は:Lispの点を説明する:結果形式は何ですか?

(dotimes (temp-one 10 temp-one)) => 10 
(setq temp-two 0) => 0 
(dotimes (temp-one 10 t) (incf temp-two)) => T 
temp-two => 10 

Hyperspecは、その結果、フォームが評価される...

を言います。 result-formが の場合、varはボディが実行された回数にバインドされます。

このことがわかりません。これらの2つの例で第3の変数が必要なのはなぜですか?dotimes?私は2番目の例で完全にそれを残すことができるように思われ、それは動作します。私の次の例(見つけた場所がわからない)、

(defun thing (n) 
    (let ((s 0)) 
     (dotimes (i n s) 
     (incf s i)))) 

私も同様です。 sはどのような用途に使用されますか?


あなたの最初の例を取ると、それを展開します:

+1

結果フォームは、ループが完了した後に戻り値(または複数)を生成するよう評価される単なるフォームです。オプションです(省略すると、戻り値は 'NIL'になります)。あなたの最後の例では、 'S'変数は' N'より下のすべての整数の合計を累積するために使われ、ループの終わりに返されます。 – jkiiski

答えて

3

以来dotimesだそれを見て、マクロでマクロの展開は、物事をより明確にすることができ、私は次の出力を得る

(pprint (MACROEXPAND-1 '(dotimes (temp-one 10 temp-one)))) 

を: (お客様の設定はCL実装によって異なる場合があります)

(BLOCK NIL 
    (LET ((#:G8255 10) (TEMP-ONE 0)) 
    (DECLARE (CCL::UNSETTABLE TEMP-ONE)) 
    (IF (CCL::INT>0-P #:G8255) 
     (TAGBODY 
     #:G8254 (LOCALLY (DECLARE (CCL::SETTABLE TEMP-ONE)) 
        (SETQ TEMP-ONE (1+ TEMP-ONE))) 
       (UNLESS (EQL TEMP-ONE #:G8255) (GO #:G8254)))) 
    TEMP-ONE)) 

多くのことが起こっていますが、見るべき重要なことは、temp-oneが値0にバインドされ、式の値として返されることです(標準のLisp評価順で)。


最後の例ください:

(pprint (macroexpand-1 '(dotimes (i n s) (incf s i)))) 

出力:あなたがここにSを見ることができるように

(BLOCK NIL 
    (LET ((#:G8253 N) (I 0)) 
    (DECLARE (CCL::UNSETTABLE I)) 
    (IF (CCL::INT>0-P #:G8253) 
     (TAGBODY 
     #:G8252 (INCF S I) 
       (LOCALLY (DECLARE (CCL::SETTABLE I)) 
        (SETQ I (1+ I))) 
       (UNLESS (EQL I #:G8253) (GO #:G8252)))) 
    S)) 

を前の例では、一時-1と同じように扱われます。


最後の変数を渡さずに1を試してみてください:

(pprint (macroexpand-1 '(dotimes (i n) (do-something i)))) 

とあなたが得る:NILは、戻り値がどのように

(BLOCK NIL 
    (LET ((#:G8257 N) (I 0)) 
    (DECLARE (CCL::UNSETTABLE I)) 
    (IF (CCL::INT>0-P #:G8257) 
     (TAGBODY 
     #:G8256 (DO-SOMETHING I) 
       (LOCALLY (DECLARE (CCL::SETTABLE I)) 
        (SETQ I (1+ I))) 
       (UNLESS (EQL I #:G8257) (GO #:G8256)))) 
    NIL)) 

お知らせ。

関連する問題