【问题标题】:Is a macro that puts the contents of a form into a string possible?将表单内容放入字符串的宏是否可行?
【发布时间】:2014-08-02 17:18:14
【问题描述】:

我想编写一个将其参数视为字符串的宏。

(defmacro args->string (&rest args)
  "Change all arguments into strings and combine them."
  (nlp/auto-generate-code-based-on-doc))

然后我可以编写如下代码:

(python> import numpy as np) ;= nil
(python> np.array([1, 2, 3])) ;= [1 2 3]
(R> rnorm(100)) ;= [0.234223 0.44234 ...]
(hy> (+ 1 1)) ;= 2

通过现有的inferior-process 框架进行进程间通信。

这在 Emacs lisp 中是否可行?

【问题讨论】:

  • 您可以从以下内容开始:(defmacro args->string (&rest args) (mapconcat (apply-partially 'format "%S") args " ")) 尽管它需要处理更多特殊情况。为什么要这样做,而不是只传递一个字符串作为开头?
  • 这对我来说是个好消息,至少有这么多是可能的!您注意到哪些特殊情况未涵盖?
  • 我想这样做是出于人们喜欢使用宏的通常原因:通过隐藏无趣的细节来使语法更易于使用。此外,转义引号是一种痛苦;-)
  • 它将反斜杠放在符号中的点前面,逗号被转义并放入小列表中。 (args->string np.array([1, 2, 3])) 返回:"np\\.array ([1 (\\, 2) (\\, 3)])"
  • 你真正想要的是一个 Common Lisp 风格的reader macro,它直接作为字符流处理程序文本(而不是已经读取的 Lisp 对象序列) .但是,Emacs Lisp 没有阅读器宏。你可能最好使用字符串。

标签: emacs macros elisp


【解决方案1】:

简短回答:不,如果不破解 Emacs Lisp 阅读器,这是不可能的。

Lisp 评估分三个步骤进行:首先,将字符转换为列表结构——这称为读取。然后,所有宏都被展开。最后,评估结果列表结构。

在调用宏时,输入已经转换为列表结构,并且丢失了大量有关原始输入的信息;在这个阶段一般不可能恢复原始输入。

正如 Jon O. 所说,您需要的是在阅读阶段更早地挂钩。这在 Common Lisp 中使用 阅读器宏 是可能的,但 Emacs Lisp 不支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 2011-03-19
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 2018-08-31
    • 2018-05-02
    相关资源
    最近更新 更多