10

许多 LISP 都有 FEXPR,但它们不包含在 CL 中。
我读到这是因为 FEXRP 不适用于静态分析。
有人可以解释一下吗?

4

3 回答 3

6

来自关于 FEXPRs 的维基百科文章

在 1980 年的 Lisp 和函数式编程会议上,Kent Pitman 发表了一篇论文“Lisp 中的特殊形式”,其中讨论了宏和 fexprs 的优缺点,并最终谴责了 fexprs。他的主要反对意见是,在允许 fexpr 的 Lisp 方言中,静态分析通常无法确定运算符是代表普通函数还是 fexpr - 因此,静态分析无法确定是否将对操作数进行评估。特别是,编译器无法判断子表达式是否可以安全优化,因为子表达式可能在运行时被视为未计算的数据。

于 2013-08-19T23:48:12.477 回答
6

Kent Pitman呼吁放弃 fexpr,因为它似乎无法编译。

有关 fexpr 的深入讨论,请参阅 John N. Shutt 的博士论文 Fexprs 作为 Lisp 函数应用的基础或 $vau :终极抽象

于 2013-08-20T00:43:28.773 回答
1

FEXPRDEFUNDEFMACRO它们成为一流的对象更像。这对编译器来说似乎很困难,因为它在编译时无法知道某个东西是函数还是宏,可能会留下一些宏在编译时没有展开。您可以在此处阅读带有评论的论文

阅读后我不确定他的结论是否仍然正确,因为我们的编译器更擅长进行高级常量折叠和其他优化。无论如何,高阶宏不如高阶函数有用,所以我们不会错过它们。

Paul Grahams Arc 有匿名宏内核也有它们,所以它并没有完全消失,但我觉得这只是为了方便。尝试map一下,您会发现它没有多大用处。

于 2013-08-20T01:00:44.737 回答