28

数値および/または数値変数をインクリメント/デクリメントする慣用的なCommon Lispの方法は何ですか?

4

1 に答える 1

39

元の数値 (引数) を変更せずに結果のみを使用する場合は、組み込みの "+" または "-" 関数、またはそれらの短縮形の "1+" または "1-" を使用します。元の場所 (数値を含む) を変更したい場合は、組み込みの "incf" または "decf" 関数を使用します。

加算演算子の使用:

(setf num 41)
(+ 1 num)   ; returns 42, does not modify num
(+ num 1)   ; returns 42, does not modify num
(- num 1)   ; returns 40, does not modify num
(- 1 num)   ; NOTE: returns -40, since a - b is not the same as  b - a

または、必要に応じて、次の省略形を使用できます。

(1+ num)    ; returns 42, does not modify num.
(1- num)    ; returns 40, does not modify num. 

Common Lisp 仕様では、上記の 2 つの形式は意味が同等であると定義されており、実装によってパフォーマンスが同等になるように提案されていることに注意してください。これは提案ですが、Lisp の専門家によると、「自尊心のある」実装ではパフォーマンスの違いは見られないはずです。

num を更新する場合 (1 + その値を取得するだけでなく)、"incf" を使用します。

(setf num 41)
(incf num)  ; returns 42, and num is now 42.

(setf num 41)
(decf num)  ; returns 40, and num is now 40.

(incf 41)   ; FAIL! Can't modify a literal

ノート:

incf/decf を使用して、1 単位以上インクリメント (デクリメント) することもできます。

(setf foo 40)
(incf foo 2.5)  ; returns 42.5, and foo is now 42.5

詳細については、Common Lisp Hyperspec: 1+ incf/decfを参照してください。

于 2010-09-17T14:16:49.187 に答える