Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >非常重要的fexpr用法示例

非常重要的fexpr用法示例
EN

Stack Overflow用户
提问于 2015-04-20 19:05:38
回答 2查看 405关注 0票数 6

我正在寻找fexprs的(真实世界)使用,其中它们的使用方式与惰性计算所能实现的方式不同。

我能找到的大多数例子只使用fexprs来实现条件求值,比如“短路”和“operative”(计算第一个参数,如果为false,则不计算第二个参数,直接返回false)。

我在寻找“有用的”用途,也就是使用fexpr可以产生比没有fexprs更“好”(更干净)的代码。

EN

回答 2

Stack Overflow用户

发布于 2015-04-22 02:24:38

您希望使用fexprs的主要原因有两个。

第一个是因为它们允许您对参数进行任意次数的计算。这使得实现运算符可以像您所建议的那样懒惰地计算其参数。以这种方式构建的构造也能够多次计算它们的参数。这使得通过fexprs实现循环成为可能!

另一种情况是转换。转换代码基本上是在现有Lisp上编写编译器的一种方式。虽然它使用宏而不是fexprs,但cl-who是可以进行这种转换的一个很好的例子。

票数 2
EN

Stack Overflow用户

发布于 2015-10-07 08:58:11

Fexpr在某种程度上与懒惰/急切求值是正交的。

通常的函数方法是对函数的参数求值,然后根据结果调用它。Lazy eval仍然是这样的,它只是将计算延迟到参数被使用之前。

通常的宏方法是将未计算的参数传递到一个模板中,该模板计算任何未被引用的内容。生成的AST片段被注入到调用点,通常会在那里再次求值。这与lazy eval的工作原理大致相同。

从历史上看,疯狂的fexpr方法是将未计算的参数传递给函数,函数可以随心所欲地使用它们。结果直接注入到调用点,通常不会自动求值。

fexpr非常接近于任意变换。所以你可以用它们实现宏和lambdas。您还可以实现您希望的任何急切/懒惰评估的混合。同样,您可以在给定默认延迟eval的情况下实现fexpr,并在不同位置显式调用eval()以强制执行急切行为。

我不认为我会将fexpr描述为实现懒惰eval的简单解决方案,尽管在治疗方面比疾病感觉更糟糕。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29756288

复制
相关文章

相似问题

添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文