|
1
16
最困难的部分是普通的lisp(和其他一些lisp)摆脱了源代码。尤其是当涉及编译器时。默认情况下,源代码不存在,只剩下机器代码。如何恢复Lisp源以及以什么形状? 原因:为什么需要一个cl程序来保存源代码?它可以完全编译为机器代码或C代码,并且在运行时没有编译器/eval。程序可以在没有开发环境(没有编译器等)的情况下运行。通用的Lisp环境也不需要能够将代码“解压”成某种重构的源代码。 而且,这通常是复杂的。
以上内容的来源是什么?您将如何改变步骤?函数依赖于词汇绑定。 另一个并发症:
如何恢复?每次Lisp读取源文本时,都会读取一个随机数。 另一个并发症:
您可以使用一些任意计算的函数或预定义的函数(如sin)设置函数值。如果它们被编译为机器代码,被加载为机器代码等,如何恢复它们? 如果公共Lisp实现保留源代码,则函数lambda表达式将检索它。 有两种方法可以解决这个问题: a)告诉lisp源代码或记住源代码。 提供来源。
扩展示例: 编写一个宏定义,它既记住源代码,又定义函数。
上面将源代码放在符号属性列表的:source下。 现在我们可以编写一个修改源代码并编译它的函数:
示例定义:
重写示例:
b)一些常见的lisp实现实现了一个名为function-lambda-expression的函数(在ansi common lisp中定义)。 此函数返回三个值:源作为lisp数据、closure-p和名称。它允许您更改源代码,编译它,并使用compile将名称设置为新函数。代码示例留作练习。 问题:在普通的lisp中,宏defun定义函数。宏在幕后所做的(IDE的簿记、代码重写等)取决于实现。因此,由函数lambda-expression返回的代码(如果实现返回源代码)对于每个实现可能看起来不同。 这是一个lispworks示例:
所以您可以操纵源表达式并更改它。 |
|
|
2
7
为什么?这是合乎逻辑的结论。您不能依赖保存源代码的编译器,所以您只需自己存储它。 之后你可以 适当地 使用函数的定义(与Javascript相反,Javascript只是黑客一个字符串表示,这是一个不稳定事物的主要例子)。 |
|
|
3
3
我们的程序代码:
将其评估为一个函数:
改变它:
这似乎与您在JavaScript代码中所做的类似。这是不是一个好主意不是你问的,所以我不提了。 (简单的更换程序,我突然想到:)
|
|
|
4
1
您编写JavaScript的方式表明您正在寻找一个宏:
所以这给了你:
宏提供了你想要的东西,因为它不是一个当前的函数工厂,它不会重写宏的名称以便你进行更改(虽然这可以用更复杂的东西来完成),但它提供了你想要的东西,因为它允许你动态地更改函数。 |
|
|
kflak · 如何在公共lisp中将函数传递给宏 1 年前 |
|
|
Denes Cselovszki · 在宏定义中使用读取器宏字符 2 年前 |
|
|
7stud · 为什么是传单和封页? 2 年前 |
|
|
Vinn · DB中的HTML未注入hunchentoot路由 2 年前 |
|
|
ptb · Slime\Emacs comint在启动mpi进程时挂起 8 年前 |
|
|
Alexandru Popa · SBCL中奇怪的宏扩展错误 8 年前 |
|
|
MadPhysicist · 公共Lisp未定义分派字符 8 年前 |