问题标签 [letrec]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scheme - Letrec 和可重入延续
有人告诉我,以下表达式的计算结果为 0,但 Scheme 的许多实现将其计算为 1:
我必须承认,我什至不知道从哪里开始。我了解 continuation 和 的基础知识call/cc
,但我能得到这个表达式的详细解释吗?
conditional-statements - cond 与本地绑定
cond
我的问题是关于将嵌套的 if 条件重写为具有本地绑定的分支的单个条件。我对球拍很陌生,只是迈出了第一步,所以如果我的问题很愚蠢,请宽容。
简而言之,任务是编写一个函数,该函数接受一个向量并在其中搜索一个值。向量包含混合的东西——对和非对。感兴趣的价值应该在一对汽车中。
工作解决方案使用带有嵌套 ifs 的递归辅助函数
我想重写它,使它cond
看起来更紧凑。下面的代码是一个可能的实现。问题是(vector-ref vec pos)
计算了几次,这就是我想重写的,这样它只计算一次,就像在前面的嵌套 ifs 实现中一样
这就是我最多取得的成就:一次调用(vector-ref vec pos)
test-expr ,另一次调用 result-expr
如何进一步el
在 test-expr 和 result-expression 之间进行共享?我想el
留在这个特定的 cond 分支的本地。下面的代码工作不正确。AFAIU,整个letrec
表达式被视为条件的文本表达式?
scheme - 为什么不将 letrec 作为修复?
在论文Fixing Letrec: A Faithful Yet Efficient Implementation of Scheme's Recursive Binding Construct by Dybvig 等人。据说(强调我的):
这些问题的理论解决方案是进行限制
letrec
,使其左侧未分配,右侧为lambda
表达式。我们将这种形式letrec
称为 asfix
,因为它相当于定点运算符的广义形式。编译器可以fix
有效地处理表达式,并且不会letrec
违反fix
. 不幸的是,letrec
以这种方式进行限制不是实现者的选择,并且在任何情况下都会降低构造的通用性和便利性。
我没有仔细检查 R5RS 报告,但是我在 Scheme 程序中使用letrec
了等效的“命名let
”,并且我不清楚论文中提到的不幸后果,有人可以启发我吗?
scheme - R6RS 的 `letrec`、`letrec*` 和 Racket 的 `letrec` 有什么区别?
两者letrec
和letrec*
都在 R6RS 中,但只有 letrec
在 Racket 中,没有letrec*
。这些之间有什么区别?
scheme - 方案 letrec 无限环境
我目前正在按照 SICP 书的步骤在 Scheme 中编写元循环评估器。
在练习中,我被要求实施letrec
,我按照以下方式进行:
但是,当我按如下方式评估表达式时,它会进入无限循环:
我想念什么吗?
scheme - 理解尾递归 2
最初我发布了一个问题“了解尾递归向量-> 列表答案”,这是附加问题。我对方案的一般理解真的很模糊。所以我现在还有几个问题:
Q2)尾递归,这让我真的很难理解。我理解他们为什么需要尾递归,并且基本上他们使用它来避免迭代,所以他们使用帮助程序作为中间例程..所以他们可以避免将每次迭代放入堆栈......这样的事情。和 letrec/lambda 表达式,如下所示:
第 Q2-2 行:为什么这是“局部递归”?“本地”对我来说听起来像是中间例程的递归......这里的中间意味着我的理解......
[我的困惑]尾递归在整个程序结束之前不应该迭代(调用)本身 - 所以不应该在中间例程中.. = 不应该在助手内部?根据我到目前为止的理解......助手是用于封装在letrec表达式中的中间例程......?。)所以最后只调用自己。(我的意思......:在letrec之外......?)。
scheme - letrec 的混乱,Scheme
我正在努力区分 let、letrec、let* ......因为方案不是我的主要编程语言,我的记忆已经不存在很长时间了..我有这个功能..现在我对 letrec 很困惑..这又是递归。我可以理解...但是在这段代码中无法建立足够的联系..(可能仍然对递归感到困惑)有人可以解释为什么这里需要 letrec
(已编辑)我理解的是尾递归
-> [Q1] 它尾递归吗?
-> [Q2] 那么,是否应该始终使用 letrec 进行尾递归?
此函数返回 x, y 的列表,边界为 start, end 因此它检查索引 i 是否在边界内,如果是,则执行第 6 行
-> [Q3] 那么,第 6 行是什么?我无法获得第 6 行
ocaml - 如何编写一个函数来在 OCaml 中创建一个循环版本的列表?
它可以使用 let rec 创建无限的循环列表,而无需求助于可变引用:
但是我可以使用同样的技术来编写一个接收有限列表并返回它的无限循环版本的函数吗?我试着写
但是出现以下错误
错误:这种表达式不允许作为 `let rec' 的右侧
lambda - 可以在不使用 lambda 的情况下将本地过程绑定到 letrec 中的变量吗?
我是计划的初学者。我曾经在使用 letrec 和使用 lambda 绑定时做过类似的程序。
但是我最近发现我们学院的估值部门不允许使用“lambda”这个结构。无论如何,在不使用 lambda 的情况下可以解决类似的问题吗?请提出任何其他替代方案。
lambda - 在方案中将 let 转换为 lambda
这是原始形式:
我正在尝试转换 let,这就是我尝试过的:
我不知道如何解决这个问题,所以如果有人可以帮助我做错了什么,那将是一个很大的帮助。