gpt4 book ai didi

macros - Lisp源代码重写系统

转载 作者:太空宇宙 更新时间:2023-11-03 18:39:04 24 4
gpt4 key购买 nike

我想使用已经过宏扩展和非宏扩展的 Emacs Lisp 代码。我在 Emacs 论坛上问过这个问题,但没有成功。看: https://emacs.stackexchange.com/questions/35913/program-rewriting-systems-unexpanded-a-defmacro-given-a-list-of-macros-to-undo

然而,人们会认为这种东西,S 表达式转换,是 Lisp 的拿手好戏。我相信 defmacro 在 Lisp 中可用,就像在 Emacs Lisp 中一样。

所以肯定有程序转换系统或术语重写系统可以在这里进行调整。

理想情况下,在某些情况下,这样的工具将能够直接脱离 defmacro 进行模式查找和替换。然而,即使我必须手动提出特定的搜索和替换模式以添加到转换系统中,拥有这样一个工作框架仍然很有用

到目前为止的结果摘要: 虽然已经有一些探索有趣可能性的答案,但目前还没有确定的答案。所以我认为最好保持开放状态。我将总结一些建议。 (我对所有实际上是答案的答案都投了赞成票,而不是对困难的评论。)

首先,许多人建议考虑仅进行扩展的特殊形式的宏,或者如 Drew 所说:

macro-expansion (i.e., not expansion followed by Lisp evaluation). Macro-expansion is another way of saying reduction semantics, or rewriting.

在我看来,目前的领跑者是 phils post,他使用了似乎特定于 Emacs 的模式匹配工具:pcase。我将对此进行探索,并将发布我的发现结果。如果其他人对此有想法,请插话。

Drew 编写了一个名为 FTOC 的程序,其目的是将 Franz Lisp 转换为 Common Lisp;谷歌搜索出现comp.lang.lisp posting

我发现了一个名为 optima 的 Common Lisp 包与 fare-quasiquote . Paulo 认为这可能不够强大,因为它不能开箱即用地处理回溯,但可以手动编程。尽管回溯的通用性可能不错,但我不认为在最常用的情况下我需要它。)

旁注:有些人似乎被引起我最初兴趣的特定应用程序推迟了。 (但请注意,在研究中,以最初未设想的方式应用好的解决方案并不少见。)

因此,本着这种精神,这里有一些更改最终应用程序的建议。一个好的解决方案可能会转化为 Emacs Lisp 的解决方案。 (如果可以帮助您假装我对 Emacs Lisp 不感兴趣,那我也无所谓)。假设我想为 clojure 或某些 Common Lisp 系统编写一个反编译器,而不是 Emacs Lisp 的反编译器。或者正如 Sylwester 的回答所建议的那样,假设我想自动重构我的代码,考虑到使用更简洁的宏的好处,这些宏已经存在或已经得到改进。回想一下,Emacs Lisp 曾一度没有“when”或“unless”宏。

最佳答案

30 多年前,我使用 macrolet 做过类​​似的事情。

(实际上,我使用了 defmacro,因为我们只有 Common Lisp 的早期实现,还没有 macrolet。但是 macrolet 是正确的用法。)

我没有将宏扩展代码翻译成它的扩展源代码,但想法几乎是一样的。我预计您会遇到一些不同的困难,因为您的翻译距离一对一更远。

我编写了一个从(当时的)Franz Lisp 到 Common Lisp 的翻译器,以帮助将大量现有代码移植到 Lisp+Prolog 机器项目中。当时的 Franz Lisp 只是动态作用域,而 Common Lisp 是(通常)词法作用域。

是的,显然没有自动翻译 Lisp 代码的通用方法(特别是),特别是考虑到它可以生成然后评估其他代码——但即使忽略这种特殊情况。许多函数非常相似,但存在词法/动态差异,以及一些看似相似的函数在语义上的显着差异。

对于任何想要使用翻译结果的人来说,所有这些都必须从一开始就被理解并视为理所当然。

不过,还有很多有用的事情可以做。如果生成的代码是 self 记录的,告诉你它是从什么派生的等等,那么当在结果上下文中时,你可以决定如何处理这个或那个可能很棘手的位(例如,手动重写它,从划伤或只是调整它)。在实践中,许多代码很容易从 Franz 转换为 Common - 它节省了大量的重新编程工作。

翻译程序是用 Common Lisp 编写的。它可以交互使用,也可以批量使用。当以交互方式使用时,它实际上提供了一个基于 Common Lisp 的 Franz Lisp 解释器。

该程序仅使用宏扩展(即,扩展后跟 Lisp 求值)。 宏扩展是另一种表达缩减语义或重写的方式。

输入的 Franz-Lisp 代码通过函数定义映射宏进行宏扩展以生成 Common-Lisp 代码。翻译有问题的代码被标记(在代码中),并带有描述情况的描述/分析。

该程序称为 FTOC。我认为您仍然可以通过谷歌搜索 (ftoc lisp) 找到它,或者至少可以找到它的引用资料。 (这是我编写的第一个 Lisp 程序,我仍然对这段经历内存犹新。这是学习 Lisp 方言和一般学习 Lisp 的好方法。)

玩得开心!

关于macros - Lisp源代码重写系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47145868/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com