lisp - 特殊的阅读器宏,如 [ ]、{ }

标签 lisp common-lisp

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

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

这能实现吗?你会怎么做?

最佳答案

是的,你要的词是readtable(Common 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)))))))

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

关于lisp - 特殊的阅读器宏,如 [ ]、{ },我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17062953/

相关文章:

emacs - 在 emacs 中设置 SLIME

math - Lisp 中的数组与列表 : Why are lists so much faster in the code below?

lisp - c IN LISP 前的抑扬音

具有多个输出的 Racket 中的单元测试

prototype - Lisp 和 Scheme 存在哪些 POOP 框架

emacs - 在 "Slime"(最新版本)中设置 "emacs"时,我如何告诉它更快地加载 swank?

lisp - 计算 lisp 中前 n 个数字的总和

lisp - IOLib 的被动套接字抛出 EADDRINUSE

matrix - Lisp 中矩阵代数的行和列标签

lisp - 函数的意外结果(递归)