1

いくつかの特別なリーダー マクロを書きたい:

[hello "world"] ; <=> (funcall #'|hello| "world")
{hello "my" ("world")} ; <=> (apply #'|hello| "my" ("world"))

これは実装できますか?そして、あなたはそれをどのようにしますか?

4

1 に答える 1

6

はい、あなたが求めている用語は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 に接続し、いくつかの構文マーカーを新しい区切り文字(との間でコピーする必要があります。)

于 2013-06-12T12:00:16.403 に答える