![]() |
1
11
这个答案不是关于Clojure,而是Lisp和宏。
宏用于从某些源代码生成新的源代码,生成的源代码将运行。
如果允许apply在运行时将不同的源代码输入宏,则需要能够在运行时生成结果代码并执行生成的代码。 因此,在已编译的Lisp系统中,每次使用宏调用APPLY都可能创建需要在运行时编译才能执行的新代码。这也意味着您可能会在运行时得到新的编译器错误,当您的代码正在执行并且代码有一些问题时。因此,要在运行时应用宏,您需要一个编译器和所有必要的信息(例如其他宏),以便能够扩展和编译代码。 这也意味着在一般情况下,不能在运行时之前使用宏编译APPLY,因为不知道要应用的运行时参数是什么。
在早期的Lisp中,有正常的函数和所谓的fexpr。FEXPRs允许灵活的调用和运行时代码操作。在Lisp历史的后期,它们已经被宏所取代,因为宏允许高效编译,并且在基于编译器的系统中,允许在运行前处理语法错误。 |
![]() |
Kon · OCaml中的模块类型语义 6 月前 |
![]() |
user20102550 · 如何在解析器中使用输入字符串 11 月前 |
![]() |
tijko · 处理整数数组时出现意外结果 1 年前 |
![]() |
David542 · 按列分区,按另一列排序 1 年前 |
|
Arnett Rufino · `max的输出是多少` 1 年前 |
![]() |
Adrian · 变量捕获:变量在函数闭包中的行为 1 年前 |