Doug Hoyte の本「Let Over Lambda」を読んでいると、次の#.
記号の説明、別名 read-macroを見つけました。
COMMON LISP に組み込まれている基本的な読み取りマクロは #. 読み取り時評価マクロ。この read マクロを使用すると、シリアル化できないが、少しの Lisp コードで作成できる、読み取るフォームにオブジェクトを埋め込むことができます。
これは第 4 章からのもので、本の大部分はここにあります: http://letoverlambda.com/index.cl/toc
これは、同じ式が毎回異なって読まれる可能性があることを示す本からの例です。
* '(football-game
(game-started-at
#.(get-internal-real-time))
(coin-flip
#.(if (zerop (random 2)) 'heads 'tails)))
(FOOTBALL-GAME
(GAME-STARTED-AT 187)
(COIN-FLIP HEADS))
* '(football-game
(game-started-at
#.(get-internal-real-time))
(coin-flip
#.(if (zerop (random 2)) 'heads 'tails)))
(FOOTBALL-GAME
(GAME-STARTED-AT 309)
(COIN-FLIP TAILS))
次に、著者はいくつかのハードコアなトリックを実演し、#
マクロでバリエーションを作成します。
#'
つまり、これもある種の読み取りマクロであることが判明し、通常は関数の名前を表すシンボルの前に使用されます。しかし、それは必要であり、そこでの彼の仕事は正確には何ですか?
高階関数のシンボルは、それの#'
有無にかかわらず配置できます。
CL-USER> (defun test nil t)
TEST
CL-USER> (funcall #'test)
T
CL-USER> (funcall 'test)
T
同じ成功を収めました。