我正在寻找(真实世界)使用fexprs,它们的使用方式与懒惰评估所能达到的方式不同。
我能找到的大多数例子都只使用fexprs来实现条件评估,比如短路"和"操作(评估第一个参数,如果错误,不评估第二个并直接返回错误)。
我正在寻找"有用"使用,即使用fexpr导致代码更好" (清洁)比没有fexprs时可以做的那样。
答案 0 :(得分:2)
您想要使用fexprs有两个主要原因。
第一个是因为它们允许您以任意次数评估参数。这使得实现像你建议的那样懒惰地评估他们的参数的运算符成为可能。以这种方式构建的构造也能够不止一次地评估它们的参数。这使得通过fexprs实现循环成为可能!
另一种情况是转型。转换代码基本上是在现有Lisp之上编写编译器的一种方法。虽然它使用宏而不是fexprs,cl-who是可以进行转换的一个很好的例子。
答案 1 :(得分:1)
Fexpr与懒惰/急切评估有些正交。
通常的函数方法是对函数的参数进行评估,然后在结果上调用它。懒惰的eval仍然表现得像这样,它只是将评估延迟到使用参数之前。
通常的宏方法是将未评估的参数传递给模板,该模板评估任何未引用的内容。将得到的AST片段注入呼叫站点,通常再次对其进行评估。这与懒惰的eval大致相同。
历史上疯狂的fexpr方法是将未经评估的参数传递给函数,这可以随心所欲地进行。结果直接注入呼叫站点,通常不会自动评估。
fexpr非常接近任意变换。所以你可以用它们实现宏和lambdas。您还可以实现您希望的任何渴望/懒惰评估的混合。同样,你可以实现fexpr给定默认的懒惰eval和在各个地方显式调用eval()来强制急切的行为。
我不认为我会将fexpr描述为实施懒惰eval的简单解决方案,但治愈方法比疾病更糟糕。