1

我想写一些特殊的阅读器宏:

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

这可以实施吗?你会怎么做?

4

1 回答 1

6

是的,您想要的术语是readtableCommon 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 回答