|
1
11
这个答案不是关于Clojure,而是Lisp和宏。
宏用于从某些源代码生成新的源代码,生成的源代码将运行。
如果允许apply在运行时将不同的源代码输入宏,则需要能够在运行时生成结果代码并执行生成的代码。 因此,在已编译的Lisp系统中,每次使用宏调用APPLY都可能创建需要在运行时编译才能执行的新代码。这也意味着您可能会在运行时得到新的编译器错误,当您的代码正在执行并且代码有一些问题时。因此,要在运行时应用宏,您需要一个编译器和所有必要的信息(例如其他宏),以便能够扩展和编译代码。 这也意味着在一般情况下,不能在运行时之前使用宏编译APPLY,因为不知道要应用的运行时参数是什么。
在早期的Lisp中,有正常的函数和所谓的fexpr。FEXPRs允许灵活的调用和运行时代码操作。在Lisp历史的后期,它们已经被宏所取代,因为宏允许高效编译,并且在基于编译器的系统中,允许在运行前处理语法错误。 |