阅读宏:你怎么使用它们? [关闭](Read macros: what do you use t

2019-07-04 01:37发布

我想这应该是我没用过很多到现在的Lisp的部分的感觉。 读宏已经引起了我的注意的时刻。 没有巨大的内容包括对信息的数量和这将有助于看到什么人跟他们做,既能得到它们是如何工作的例子,也看什么类型的问题可以与他们接近。 继上,是否有知道什么是好的和坏的使用读取宏的任何指引?

Answer 1:

S-表达式是Lisp的对Lisp的数据语法。 S-表达与功能READ读,读宏是Lisp的扩展读卡器内置方式。 这意味着,最直接的使用读取宏是实施预先定义的数据语法和开拓的可能性改变或扩展Lisp的读取s表达式的方式。

Lisp的附带了大量的数据类型的一个预先定义的外部语法:符号,数字,字符串,数组,字符,conses之外,列表,结构等等。 它允许要被打印和读回的数据对象。

  1. Lisp的缺乏语法其他几种数据类型 - 突出哈希表和CLOS的对象。 所以在第一次使用的用户码读取宏将扩大读者能够读出的数据结构,如哈希表,并行向量,新的号码类型,...基本上每种数据类型开发人员希望有一个外部的语法可以回读。

  2. 由于Lisp的使用S-表达式也为代码,第二次使用读取宏是扩展符号的Lisp程序。 一个典型的例子是使用[和]写嵌入式SQL代码。 通常的Lisp的语法看起来相似,但使用[和]帮助SQL表达式中的代码中脱颖而出。 另一个例子是使用读出的宏来为嵌入式编程语言提供的标识符,像目标C常数,消息等。Clozure CL使用此来表示大小写敏感/情况下保存标识符和使用的索引中读出时间,以查找其定义外部可用标识符。

  3. 第三用途是不同的语法嵌入到Lisp的语法。 旧的例子为的是缀读取宏,它允许嵌入的缀表达式。 其他的例子嵌入HTML或XML语法,或嵌入到其他编程语言的语法的片段。

  4. 有时读宏用于实现使用s表达式语法是从预先定义的Common Lisp的语法不同其他(相关的)语言。 一个例子是在方案s表达式读者 - 这是从Common Lisp的略有不同。



Answer 2:

当对于您可能希望有文字对象语法阅读器宏使用。 与他们的一个问题是可能的语法中的平面命名空间(但是,也有方法可以解决这一点)。 有没有读者宏的许多用途。 浮现在我的脑海里是一些例子:

  • http://weitz.de/cl-interpol/ -字符串插值和扩展字符串表示法的语法
  • http://trac.clozure.com/openmcl/wiki/OpenMclFfi -从C语言(FFI的自动化形式)出口符号的语法
  • http://clsql.b9.com/manual/sql.html -对SQL查询语法-不是非常有用
  • http://www.agentsheets.com/lisp/XMLisp/ -嵌入文本XML片段的成Lisp代码


Answer 3:

事实上,我倾向于避免他们为我的普通Lisp代码; 最近,我甚至发现自己拒绝,因为它使用读者宏的第三方库。 这主要是由于这样的事实,即不同的符号,只有一个单一的“命名”为读者宏。 我似乎经常选择适当的调度角色时,有关他们的口味库的作者不同意。

但是,我用定做非标readtables +简单的解析任务成功读取 。 我工作迄今已使用自定义readtable最复杂的解析器事情是一个HTML模板引擎(另一个,抱歉)类似于JSP / ASP语法,但使用的Common Lisp作为实际的模板语言,所以你可以有类似的事情

<% (for (title . link) in breadcrumb do %><a href="<%= link %>"><%= title %></a><% ) %>

(不是用readtable黑客独自完成,不过,代码必须经过预处理阶段)。



Answer 4:

虽然我用了很多的宏,我从来没有发现需要使用读取宏,从休闲实验分开。 如果有帮助,在“让我们在拉姆达”,你会发现对他们进行了广泛讨论: http://letoverlambda.com/index.cl/toc



Answer 5:

我在Github上两个小项目,显示如何以及为什么人们可能希望使用Common Lisp的读者宏。 这些都是弹震和Boxen有 。 在其他的答案提到的, CL-INTERPOL是奥斯坦丁和有用的例子。

无论这些都是读者宏的用途显然是主观的,但肯定我一定认为它是有用的或者我就不会写代码!



Answer 6:

一个特别常见的和有用的替代语法,你可以读宏嵌入是正则表达式的语法。 这不是在所有的硬盘来实现它,因为它只是读一字符串不同的转义规则,但如果使用正则表达式都频繁,它真的可以还清。 该CL-刑警梅德-VK提到库提供此功能,用了很多其他功能一起。



Answer 7:

见梅耶Dyomkin的 回答了我的问题编写可在命令行中执行的Common Lisp代码,而不是解释器 ,这是读者宏的应用。



文章来源: Read macros: what do you use them for? [closed]