像[],{}这样的特殊读者宏

时间:2013-06-12 10:15:48

标签: lisp common-lisp

我想写一些特殊的读者宏:

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

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

1 个答案:

答案 0 :(得分:6)

是的,您想要的术语是readtableCommon Lisp HyperSpec chapter 23Common Lisp HyperSpec chapter 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)))))))

之后,您需要将其连接到可读表并将一些语法标记从()复制到新的分隔符。