いくつかの特別なリーダー マクロを書きたい:
[hello "world"] ; <=> (funcall #'|hello| "world")
{hello "my" ("world")} ; <=> (apply #'|hello| "my" ("world"))
これは実装できますか?そして、あなたはそれをどのようにしますか?
いくつかの特別なリーダー マクロを書きたい:
[hello "world"] ; <=> (funcall #'|hello| "world")
{hello "my" ("world")} ; <=> (apply #'|hello| "my" ("world"))
これは実装できますか?そして、あなたはそれをどのようにしますか?
はい、あなたが求めている用語はreadtable
( Common Lisp HyperSpec の第 23 章とCommon Lisp HyperSpec の第 2 章で関連する概念について説明しています) です。
最初に、関心のあるデータを読み取ることができる関数を定義してから、必要な形式で返す必要があります。
(defun read-case-preserve-funcall-or-apply (stream char)
(let ((preserved-readtable-case (readtable-case *readtable*)))
(setf (readtable-case *readtable* :preserve))
(let ((tmp (read-delimited-list (if (char= char #\[) #\] #\}) stream t)))
(let ((fun (car tmp))
(args (cdr tmp)))
(cond ((char= char #\[) `(funcall (function ,fun) ,@args))
((char= char #\{) `(apply (function ,fun) ,@args)))))))
その後、それを readtable に接続し、いくつかの構文マーカーを新しい区切り文字(
との間でコピーする必要があります。)