2

これを発見したとき、私はSLIME(Clozure REPLに接続)をいじっていました:

変数 +、*、および / はすべて、最近の入力の何らかのバリエーションにバインドされているように見えます。+ は入力自体、* はその入力を評価した結果、/ はリストに含まれる結果です。

これは正しいですか?SLIME と Clozure のどちらが責任を負っていますか? SLIME のマニュアルには何も見つかりませんでした。

ありがとう!

; SLIME 2010-05-13
CL-USER> +
NIL
CL-USER> *
NIL
CL-USER> /
(NIL)
CL-USER> -
-
CL-USER> +
-
CL-USER> (list 1 2)
(1 2)
CL-USER> +
(LIST 1 2)
CL-USER> /
((LIST 1 2))
CL-USER> (+ 1 2)
3
CL-USER> /
(3)
CL-USER> *
(3)
CL-USER> (* 1 2)
2
CL-USER> *
2
CL-USER> 
4

2 に答える 2

4

これらはすべて、Common Lisp 標準によって指定されています。環境ディクショナリで「変数」を検索します。

于 2010-09-09T18:11:17.837 に答える
1

+
++
+++

トップレベルのループによってフォームが評価されている間、変数 + はループによって読み取られた前のフォームにバインドされます。変数 ++ は + の前の値 (つまり、2 回前に評価されたフォーム) を保持し、+++ は ++ の前の値を保持します。

-

フォームが最上位ループによって評価されている間、変数 - はフォーム自体にバインドされます。つまり、この相互作用が完了すると + に与えられる値です。

*
**
***

トップレベルのループによってフォームが評価されている間、変数 * は、ループの最後の回の最後に出力された結果にバインドされます。つまり、フォームを + で評価することによって生成される値です。複数の値が生成された場合、* には最初の値のみが含まれます。* ゼロ値が生成された場合、nil が含まれます。変数 ** は、* の前の値 (つまり、2 回前に出力された結果) を保持し、 *は ** の前の値を保持します。

/
//
///

トップレベルのループによってフォームが評価されている間、変数 / は、ループの最後の回の最後に出力された結果のリストにバインドされます。つまり、フォームを + で評価することによって生成されるすべての値のリストです。* の値は常に / の値の車と同じでなければなりません。変数 // は / の前の値 (つまり、2 回前に出力された結果) を保持し、 /// は // の前の値を保持します。したがって、** の値は常に // の car と同じでなければならず、*と /// についても同様です。

Common Lisp the Language、第 2 版 20.2より

于 2012-02-15T18:12:03.527 に答える