我正在寻找fexprs的(真实世界)使用,其中它们的使用方式与惰性计算所能实现的方式不同。
我能找到的大多数例子只使用fexprs来实现条件求值,比如“短路”和“operative”(计算第一个参数,如果为false,则不计算第二个参数,直接返回false)。
我在寻找“有用的”用途,也就是使用fexpr可以产生比没有fexprs更“好”(更干净)的代码。
发布于 2015-04-22 02:24:38
您希望使用fexprs的主要原因有两个。
第一个是因为它们允许您对参数进行任意次数的计算。这使得实现运算符可以像您所建议的那样懒惰地计算其参数。以这种方式构建的构造也能够多次计算它们的参数。这使得通过fexprs实现循环成为可能!
另一种情况是转换。转换代码基本上是在现有Lisp上编写编译器的一种方式。虽然它使用宏而不是fexprs,但cl-who是可以进行这种转换的一个很好的例子。
发布于 2015-10-07 08:58:11
Fexpr在某种程度上与懒惰/急切求值是正交的。
通常的函数方法是对函数的参数求值,然后根据结果调用它。Lazy eval仍然是这样的,它只是将计算延迟到参数被使用之前。
通常的宏方法是将未计算的参数传递到一个模板中,该模板计算任何未被引用的内容。生成的AST片段被注入到调用点,通常会在那里再次求值。这与lazy eval的工作原理大致相同。
从历史上看,疯狂的fexpr方法是将未计算的参数传递给函数,函数可以随心所欲地使用它们。结果直接注入到调用点,通常不会自动求值。
fexpr非常接近于任意变换。所以你可以用它们实现宏和lambdas。您还可以实现您希望的任何急切/懒惰评估的混合。同样,您可以在给定默认延迟eval的情况下实现fexpr,并在不同位置显式调用eval()以强制执行急切行为。
我不认为我会将fexpr描述为实现懒惰eval的简单解决方案,尽管在治疗方面比疾病感觉更糟糕。
https://stackoverflow.com/questions/29756288
复制相似问题