3

要するに、違いは何ですか?

(setq var1 `(,(get-internal-real-time)))
var1
-->(1358995178904535)
var1
-->(1358995178904535)

(setq var2 '(#.(get-internal-real-time)))
var2
-->(1358995195568422)
var2
-->(1358995195568422)

おそらく「read-time eval」とは、変数を読み取るたびに評価されることを意味すると思いましたが、間違っていたと思います.quasiquote evalもそれを行いません。

4

3 に答える 3

4

読み取り時の影響を単独で確認したい場合は、フォームを評価する REPL を使用することはお勧めできません。REPL は READ EVAL PRINT LOOP を意味します。すべてのコードが読み取られ、評価され、出力されます。読むだけじゃない。

代わりにこれを見てください:

CL-USER > (read-from-string "`(,(get-internal-real-time))")
(LIST (GET-INTERNAL-REAL-TIME))

逆引用符リストの読み取りバージョンが定義されていないため、上記の結果は実装に少し依存します。しかし、効果は似ています: Lisp リーダーから返された結果のフォームはLIST、引数としてサブフォームを使用した呼び出し (または同等のもの) です。

CL-USER > (read-from-string "'(#.(get-internal-real-time))")
(QUOTE (465370171))

上記は、読み取り時にフォームを実行し、読み取り操作の結果である式に値を含めます。

于 2013-01-24T09:04:24.500 に答える
4

違いが重要な例:

* (defun foo () `(,(get-internal-real-time)))
FOO
* (defun bar () '(#.(get-internal-real-time)))
BAR
* (foo)
(44577)
* (foo)
(47651)
* (bar)
(41929)
* (bar)
(41929)

ご覧のとおり、(この(setq var1 ...)場合のように) 値を直接使用していない場合、準引用符は毎回展開され、異なる値を返します。ただし、読み取り時の評価では、一度だけ呼び出され、同じ値が何度も返されます。

于 2013-01-24T08:48:50.620 に答える
3

「読み取り時評価」は、コード自体が読み取られるたびに評価されることを意味します。var2REPL を入力すると、変数を読み取らず、その値にアクセスします。したがって、あなたの場合、両方の形式で同じ結果が得られます。

于 2013-01-24T04:42:57.480 に答える