1
86
lisp用户将lisp称为 可编程编程语言 . 它被用于 符号计算 -用符号计算。 宏只是利用符号计算范式的一种方法。更广泛的观点是,Lisp提供了描述符号表达式的简单方法:数学术语、逻辑表达式、迭代语句、规则、约束描述等等。宏(lisp源表单的转换)只是符号计算的一个应用程序。 这其中有一些方面:如果您询问有关“重新定义”语言的问题,那么严格地重新定义意味着重新定义一些现有的语言机制(语法、语义、语用学)。但也有语言功能的扩展、嵌入和删除。 在Lisp的传统中,有很多尝试提供这些特性。Lisp方言和某个实现可能只提供其中的一个子集。 一些方法可以重新定义/更改/扩展主要常见的Lisp实现提供的功能:
Lisp拥有这些和更多的工具,因为它已经被用于实现许多不同的语言和编程范例。一个典型的例子是逻辑语言的嵌入式实现,比如prolog。lisp允许使用s表达式描述prolog术语,并且使用特殊的编译器,可以将prolog术语编译为lisp代码。有时需要常规的prolog语法,然后解析器将典型的prolog术语解析为lisp形式,然后编译。嵌入式语言的其他示例包括基于规则的语言、数学表达式、SQL术语、内联Lisp汇编程序、HTML、XML等等。 |
2
14
在定义新的语法时,我将介绍该方案不同于普通的Lisp。它允许您使用
下面是一个如何
请注意,这和文本替换完全不同。你可以重新定义
|
3
4
宏通常是这样说的原因。其思想是,因为代码只是一个数据结构(树,或多或少),所以您可以编写程序来生成这个数据结构。因此,关于编写生成和操作数据结构的程序,您所知道的一切都增加了您表达代码的能力。 宏并不是语言的完全重新定义,至少据我所知(我实际上是一个阴谋家;我可能是错的),因为有一个限制。宏只能获取代码的一个子树,并生成一个子树来替换它。因此,您不能编写整个程序来转换宏,就像那样酷。 然而,宏仍然可以做很多事情——绝对比任何其他语言都能做的多。如果您使用的是静态编译,那么对整个程序进行转换一点也不困难,因此限制就不那么重要了。 |
4
3
我在答案中遗漏了“计算机程序的结构和解释”第4-5章。( link ) 这些章节指导您在Lisp中构建Lisp评估器。我喜欢这本书,因为它不仅展示了如何在新的评估器中重新定义Lisp,而且还让您了解Lisp编程语言的规范。 |
5
2
尽管部分答案可能适用于Lisp系列中的其他语言,但此答案专门针对普通Lisp(以下简称cl)。 由于cl使用s表达式,并且(大部分)看起来像一系列函数应用程序,所以内置代码和用户代码之间没有明显的区别。主要区别在于“语言提供的东西”在编码环境中的特定包中可用。 稍微小心一点,编写替换代码并使用它们并不难。 现在,“普通”阅读器(读取源代码并将其转换为内部符号的部分)希望源代码是一种相当特定的格式(带括号的S表达式),但由于阅读器是由一种称为“读取表”的东西驱动的,开发人员可以创建和修改这些表,因此也可以更改源代码E应该看看。 这两件事至少应该提供一些理由,解释为什么公共lisp可以被认为是一种可重新编程的编程语言。我手头没有一个简单的例子,但我确实有一个通用lisp到瑞典语的部分实现(创建于4月1日,几年前)。 |
6
2
从外面往里看… 我一直认为这是因为lisp在其核心提供了这样的基本原子逻辑操作符,任何逻辑过程都可以从基本组件中构建(并且已经构建并作为工具集和插件提供)。 与其说它能够重新定义自己,不如说它的基本定义是如此具有延展性,以至于它可以采用任何形式,而且结构中没有假定或假定任何形式。 作为一个比喻,如果你只有有机化合物,你就做有机化学;如果你只有金属氧化物,你就做冶金;如果你只有元素,你就可以做所有的事情,但是你有额外的初始步骤要完成……其他人已经为你做了很多…… 我想。。。。。 |
7
2
很酷的例子 http://www.cs.colorado.edu/~ralex/papers/PDF/X-expressions.pdf 读卡器宏定义X表达式与S表达式共存,例如,
普通香草口齿不清 http://www.AgentSheets.com/lisp/XMLisp/XMLisp.lisp …
…当然,XML解析器并不是那么简单,但是将它连接到Lisp阅读器中是很简单的。 |
lightning_missile · 词法范围和共享对象 6 年前 |
Alexandru Popa · SBCL中奇怪的宏扩展错误 6 年前 |
Jacky · 编辑列表中的每个偶数索引元素 6 年前 |
HappyFace · lisp典型缩进约定背后的规则是什么? 6 年前 |
Jorge · 在公共Lisp中初始化计数器变量 6 年前 |
Rorschach · cl循环破坏性修改cons单元 6 年前 |