macros - 是否有向 "generic"程序员解释 Lisp 宏的简单示例?

标签 macros lisp common-lisp

我最近与一位同事交谈,并试图告诉他(通用)Lisp 的美妙之处。我试图以某种方式解释宏,因为我认为宏是 Lisp 的 killer 级特性之一,但我失败得很惨——我找不到一个很好的例子,它简短、简洁并且“凡人”可以理解"程序员(十年的 Java 经验,一个非常聪明的人,但对“高阶”语言的经验很少)。

如果必须的话,您会如何通过示例来解释 Lisp 宏?

最佳答案

根据我的经验,当人们看到它如何帮助生成程序或其他结构无法生成的代码时,宏会给人们留下最好的印象。通常这样的事情可能被描述为:

<common code>
<specific code> 
<other common code>

哪里<common code>总是一样的。以下是此类架构的一些示例:

<强>1。 time宏。 没有宏的语言中的代码将如下所示:

int startTime = getCurrentTime();
<actual code>
int endTime = getCurrentTime();
int runningTime = endTime - startTime; 

您不能将所有通用代码都放在过程中,因为它包装了实际代码。 (好吧,如果语言支持的话,你可以制作一个过程并在 lambda 函数中传递实际代码,但并不总是很方便)。
而且,您很可能知道,在 Lisp 中您只需创建 time宏并将实际代码传递给它:

(time 
  <actual code>) 

<强>2。事务。 请 Java 程序员编写简单的方法 SELECT使用 JDBC - 需要 14-17 行,包括打开连接和事务的代码,关闭它们,多个嵌套 try-catch-finally语句和只有 1 或 2 行唯一代码。
在 Lisp 中你只需写 with-connection宏并将代码减少到 2-3 行。

<强>3。同步。 好吧,Java、C# 和大多数现代语言都已经有它的语句,但是如果您的语言没有这样的结构怎么办?或者,如果您想引入新的同步方式,例如 STM基于交易?同样,您应该为此任务编写单独的类并手动使用它,即在您要同步的每个语句周围放置通用代码。

这只是几个例子。你可以提到“不要忘记”的宏,比如 with-open系列,清理环境并保护您免受资源泄漏,新构造宏,如 cond而不是多个 if s,当然,不要忘记像 if 这样的惰性构造, orand ,不评估他们的论点(与程序申请相反)。

一些程序员可能会主张,他们的语言有一种技术来处理这种或那种情况(ORM、AOP 等),但是问他们,如果存在宏,是否需要所有这些技术?

因此,综合考虑并回答有关如何解释宏的原始问题。将 Java 中任何广泛使用的代码(C#、C++ 等)转换为 Lisp,然后将其重写为宏。

关于macros - 是否有向 "generic"程序员解释 Lisp 宏的简单示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4558970/

相关文章:

haskell - Lisp 中复制 Mathematica 功能的替换函数

common-lisp - 为什么 dribbble 会生成一个空文件?

LispBox 如何打破循环?

c++ - 宏 `assert` ,为什么它不能在全局范围内编译?

Lisp 递归不能正常工作

syntax - 为什么我需要写(doc str)但是(meta #'str)?

vim - OS X Lion 上的 slimv 段错误

function - 在 Lisp 中,如何修复 "Warning: Assumed Special?"

scala - 在 Scala 宏中,如何获取类的完整 `extends` 子句?

c++ - 根据 cmake 目标启用宏