2011-07-28 5 views
3

私はelispに値を順番に出力するループを作成しようとしています。elispでローカル変数をインクリメントする方法

私は以下のコードを試してみました。コード内のエラーを指摘してください。

(let ((inc_variable 0)) 
    (message "%S" inc_variable) 
    (while t (let ((inc_variable (+ inc_variable 1))) 
    (message "%S" inc_variable)))) 

答えて

8

このコードでinc_variableためバインディングがあります。外側の束縛は値0を持ち、変化しません。次に、ループのたびに、inc_variableの新しいバインディングを作成します。このバインドには、1に加えて外部バインディングの値(常に0です)が設定されます。したがって、内部バインディングは毎回値1を取得します。

letは常に結合新しいを作成することを忘れないでください:setqを使用し、あなたが既存バインディングの値を更新する場合:

(let ((inc-variable 0)) 
    (while t 
    (message "%S" inc-variable) 
    (setq inc-variable (+ inc-variable 1)))) 
+2

最後の行は '(setqのINC-変数(1+ INC可変))))' Iは、原稿をその行で '1 +' – sebs

+1

をインクリメントするための機能でビルドを使用してコピーしたために減少させることができますポスターを明瞭にするため。 (一度に1つの問題を解決してください!)それが私のコードだったら 'incf inc-variable 'と書くでしょう。 –

3

変数をインクリメントするもう一つの方法は、clからincfを使用することです:

(require 'cl) 
(let ((x 0)) 
    (incf x) 
    (message "%d" x) 
) 

ループは次のようになります。

(require 'cl) 
(let ((x 0)) 
    (while (< x 10) (incf x) 
     (insert (format "%d\n" x)) 
) 
) 
関連する問題