问题标签 [seasoned-schemer]
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 - 缓存方案中过程的先前返回值
在“The Seasoned Schemer”的第 16 章中,作者定义了一个递归过程“depth”,它返回嵌套在 n 个列表中的 'pizza,例如 (depth 3) is ((((pizza)))。然后他们将其改进为“depthM”,它使用 set 缓存其返回值!在列表 Ns 和 Rs 中,它们一起形成了一个查找表,因此如果您达到以前见过的返回值,则不必一直向下递归。例如,如果我已经计算过 (depthM 8),当我稍后计算 (depthM 9) 时,我只需查找 (depthM 8) 的返回值并将其设置为 null,而不是一直递归到 (depthM 0) .
但随后他们将 Ns 和 Rs 移动到过程中,并用“let”将它们初始化为 null。为什么这不能完全破坏缓存返回值的意义?从一些实验来看,Ns 和 Rs 似乎在每次调用“depthM”时都被重新初始化。
我误解了他们的观点吗?
我想我的问题确实是这样的:Scheme 中有没有办法让词法范围的变量在调用过程之间保留它们的值,就像你可以在 Perl 5.10 中使用“状态”变量一样?
scheme - 测试两对(cons 单元格)是否相同
来自Seasoned Schemer的 pg 150 的以下函数通过改变每个列表的 cdr 然后检查更改是否影响两者来确定两个列表是否具有相同的身份(即占用相同的内存):
现在,如果我定义a_list
如下:
并评估
该函数返回#f,调试器(Dr. Racket)确认这两个列表——它们应该共享它们的大部分成员,因为第二个参数是第一个参数的真子集——实际上确实有不同的副本相同的成员。这怎么可能?!
稍微改变一下这个想法:
现在a_list
是周期性的。如果我用它测试这个函数,same?
它只在两个参数同相时注册#t,即(same? a_list a_list)
和(same? a_list (cdddr a_list))
。
[编辑答案在已接受帖子评论链的底部]
scheme - 《老谋深算》中的长度函数
我一直在阅读 The Seasoned Schemer 并且遇到了长度函数的这个定义
后来他们说:
(L (lambda (arg) (h arg))) 的值是多少?这是功能
我不认为我完全理解这一点。我想我们应该把L定义为一个练习。我使用 letrec在长度定义中写了L的定义。这是我写的:
因此,L将一个函数作为其参数,并将另一个函数作为值返回,该函数将一个列表作为其参数并在列表上执行递归。我的解释是正确的还是完全错误的?无论如何定义有效
scheme - 经验丰富的 Schemer 的 get-first、get-next 和 waddle 函数
对于任何不熟悉“The Seasoned Schemer”一书的人来说get-first
,get-next
、 和waddle
(最后两个未在此处定义)显然是对协程建模以遍历传递给仅产生叶子的树的过程。waddle
就在waddle
倒数第二次重新进入的 yield 之前,它将重新进入点设置为它只会返回纯值的位置,即is的实际值而'()
不是yield ,就好像它是一直都是纯函数。 '()
waddle
'()
考虑到这一点,我们可以看到get-first
设置了什么......当waddle
返回“真实”时,它将在call/cc
in内部get-first
,然后(leave (quote ()))
是get-first
(并且,反过来,这leave
旨在返回到get-next
最后一次迭代,因此,它是)get-next
的“实际”回报'()
。
那么为什么第二个版本不等价,其中waddle
的值'()
将是 的参数leave
?
functional-programming - 经验丰富的计划者,letcc 和诡计
这里有几个问题,关于letcc
那个在 The Seasoned Schemer 中使用。
我想我理解
letcc
实现了什么,这基本上类似于ruby 中的catch
andthrow
(并且看似 CL),这基本上意味着可以通过调用任何命名的东西来缩短整个代码块letcc
。这感觉像是我在这一系列短书中遇到的最不“实用”的东西,它让我觉得使用它有点犹豫,因为我想学习一种好的实用风格。我只是误解letcc
,还是它不是真正的函数式编程概念,只是为了提高性能而存在?我可以在一些例程中间然后突然进入代码中的另一个点的整个想法感觉有点不对……就像在 Java 中滥用 try/catch 来进行程序流一样。letcc
我在 OS X 中安装的 guile (1.8.7) 版本中似乎不存在。我应该在 guile 中寻找它的另一个名称吗?如果我
letcc
通过将它与 Java 中的 try/catch 或 ruby 中的 catch/throw 进行比较而产生误解(这不是异常处理,只是为了清楚,对于非 ruby 主义者),它在功能级别上究竟是如何工作的? 它能否以更长、更复杂的方式表达,让我相信它毕竟是功能性的?
scheme - Racket 中是否有类似“try”的功能
现在我通过看The Seasoned Schemer这本书来学习计划者。我用球拍写了代码,但是当我使用 时try
,schemer 没有这个方法或宏。它报告了扩展:模块中的未绑定标识符:尝试。代码如下:(在第89页)
我搜索了球拍文件,但没有找到类似的功能。
那么谁知道是否有像“try”这样的功能呢?
scheme - 经验丰富的计划者中的最左边和 lm
第 78 页的经验丰富的计划者对leftmost
和的定义如下lm
。
在下一页上,它对值部分中有多个表达式进行了以下说明。例如,我不明白它如何leftmost
工作的解释(() a)
。
当 (let ...) 在其值部分有两个表达式时,我们必须首先确定第一个表达式的值。如果它有一个,我们忽略它并确定第二个表达式的值。”
functional-programming - 经验丰富的计划者:Intersectall(第 49 页)
在The Seasoned Schemer的第 49 页,我无法理解以下代码中发生了什么(第 14-16 行):
我的疑问在第 14 行:
如果(car s1)
是 的成员s2
,不应该将其包含在结果中吗?同样,在第 15 行和第 17 行:
如果它不是的成员s2
,不应该跳过它而不将其包含在结果中吗?
scheme - 先入为主的老谋深算者
请看two-in-a-row*?
第 19 章中的函数。
我的问题是关于辅助函数(leave '())
中的。get-first
请注意,(waddle l)
将返回'()
或返回原子,这表明列表已用尽或检索到列表中的原子。
没有(leave '())
它仍然会返回这两种值,只是不使用 continuation leave
。但是书上说没有(leave '())
就是不好的,我就是不明白为什么。
非常感谢。
关于这个问题的另一个有趣的步骤。
model - 使用 2 个长度和频率不等的时间序列进行预测
我有 2 个时间序列。1) 2013 年至 2016 年每月住宅天然气需求 2) 2013 年至 2017 年 3 月 31 日的日平均温度
我必须提供 2017 年 1 月至 2017 年 4 月期间住宅天然气需求的每月和每日预测。
在准备好处理 NaN 和 Na 的数据后,我必须将温度转换为月平均温度。然后我应该建立模型来估计需求的未来值。
我是 R 和计量经济学的新手。
我可以在 R 中使用哪种转换将日平均温度时间序列转换为月平均温度时间序列?
矢量自相关是季节性数据的好模型吗?我应该使用温度和旧的需求值来预测未来的需求。