首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不使用"set!“的情况下实现"letrec”?

如何在不使用"set!“的情况下实现"letrec”?
EN

Stack Overflow用户
提问于 2011-12-12 07:35:51
回答 2查看 1.8K关注 0票数 7

不使用set!如何实现letrec

在我看来,set!是一种命令式编程构造,使用它会失去函数式编程的好处。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-12 07:42:55

我知道我们通常要求复制内容,但对于您的问题没有简短的答案。http://www.cs.indiana.edu/~dyb/pubs/fixing-letrec.pdf

票数 10
EN

Stack Overflow用户

发布于 2011-12-13 07:02:15

不是的。仅仅因为一个功能特性是在幕后使用命令式代码实现的,这并不意味着该特性就是命令性的。我们的计算机器都是命令式的;所以在某些时候,所有的功能代码都必须通过翻译成命令式代码来实现!

这里要理解的关键是:函数式编程适用于接口,而不适用于implementation.如果一段代码本身不能观察到任何副作用,那么这段代码就是功能性的--即使副作用实际上是在幕后发生的。也就是说,如果您多次检查同一变量的同一绑定的值,您将得到相同的值-即使该值在幕后是通过使用set!放在那里的。

在使用letrec的情况下,这里有一个小问题:如果对letrec中的任何绑定的求值导致另一个绑定被取消引用,则结果是未定义的。因此,此代码的结果是未定义的:

代码语言:javascript
复制
(letrec ((foo bar)
         (bar 7))
  (cons foo bar))

letrec正文中的foo值未定义。另一方面,定义以下结果:

代码语言:javascript
复制
(letrec ((foo (lambda () bar))
         (bar 7))
  (cons (foo) bar))

这是因为计算lambda会捕获对bar的引用,但直到在主体中执行闭包时才会查找实际值。

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

https://stackoverflow.com/questions/8468421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档