问题标签 [the-little-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.
lambda - 为什么 The Little Schemer 中的所有 lambda 表达式?
在从 SICP 学习了一些 Scheme 之后,我开始阅读 The Little Schemer(我觉得这本书很有趣),大约完成了四分之一。我注意到我可以在不使用 lambda 的情况下编写许多(大多数?全部?)解决方案,而 The Little Schemer总是使用它们。例如,第一个定义是
除非我弄错了,否则可以更简单地写成
如果我编写无 lambda 解决方案,我是否缺少一些基本的东西?
recursion - 解释 The Little Schemer 的 p.137 的延续例子
有问题的代码是这样的:
我整天盯着这个,但我似乎不太明白。当您重新定义您正在重新定义的函数时,col
但在示例中它们似乎使用了原始定义。为什么不改。如果不传入参数newlat
和seen
.
很难解释我的问题,因为我似乎只是错过了一块。如果也许有人可以提供比这本书更明确的演练,我也许能够理解它是如何工作的。
scheme - 仅使用“The Little Schemer”中的表格来展平列表
我正在通过 The LIttle Schemer 学习 Scheme(作为一个老 C 程序员),作为一个练习,我尝试编写一个仅使用The Little Schemer 中的表单来展平列表的过程;即 , define
, lambda
, cond
, car
, cdr
,等,and
但不是。我认为这很容易,但我无法提出解决方案。我怎样才能做到这一点 ?or
append
recursion - 递归 Clojure 中的 s 表达式列表
为了设置一些上下文,我正在学习 Clojure,以及更普遍的 Lisp 开发。在通往 Lisp 的道路上,我目前正在研究“小”系列,以巩固函数式编程和基于递归的解决方案解决方案的基础。在“The Little Schemer”中,我完成了许多练习,但是,我在将其中一些练习转换为 Clojure 时遇到了一些困难。更具体地说,我正在努力将它们转换为使用“recur”以启用 TCO。例如,下面是“occurs*”函数(来自 Little Schemer)的基于 Clojure 的实现,它计算出现在 S 表达式列表中的原子的出现次数:
基本上,(occurs 'abc '(abc (def abc) (abc (abc def) (def (((((abc)))))))))
将评估为 5。明显的问题是,这个定义会消耗堆栈帧,并且如果给定的 S 表达式列表太深,则会破坏堆栈。
现在,我了解了重构递归函数以使用累加器参数以将递归调用置于尾部位置(以允许 TCO)的选项,但如果此选项甚至适用于诸如此类的情况,我正在苦苦挣扎。
如果我尝试使用“recur”以及使用累加器参数来重构它,我会走多远:
所以,我觉得我快到了,但并不完全。明显的问题是我的“else”子句,其中列表的头部不是原子。从概念上讲,我想将列表中第一个元素的重复结果与列表其余部分的重复结果相加。我正在努力思考如何重构它,以便可以将递归移动到尾部位置。
“累加器”模式是否有其他技术可以实现将递归调用置于我应该在这里应用的尾部位置,或者,问题只是更“基本”并且没有干净的基于 Clojure 的解决方案由于JVM缺乏TCO?如果是后者,一般来说,Clojure 程序使用需要在 S 表达式列表上递归的一般模式应该是什么?对于它的价值,我已经看到使用了多方法 w/lazy-seq 技术(Halloway 的“Programming Clojure”的第 151 页供参考)“Replace Recursion with Laziness”——但我不确定如何应用该模式在这个例子中,我不是试图建立一个列表,而是计算一个整数值。
提前感谢您对此的任何指导。
scheme - “The Little Schemer”中的 Y 组合器讨论
因此,我花了很多时间阅读和重新阅读The Little Schemer中第 9 章的结尾,其中为该length
功能开发了应用 Y 组合器。我认为我的困惑归结为一个对比两个版本的长度的声明(在组合器被分解之前):
第 170 页(第 4 版)指出,A
当我们将它应用于参数时返回一个函数
而乙
不返回函数
从而产生自我应用的无限倒退。我被这件事难住了。如果 B 受到这个问题的困扰,我看不出 A 是如何避免的。
recursion - The Little Schemer 仅偶数*&co
我很难理解evens-only*&co
第 145 页上 The Little Schemer 的示例发生了什么。
这是代码:
初始col
可以是:
我没有得到的是,使用l
as时,它会立即使用as和as'((1) 2 3)
进入决赛。很好,但是我的大脑一片空白,试图从, ,中找出, , 。如果有人可以指导我如何设置 DrRacket 或 Chez Scheme 或 MIT-Scheme 来运行步进器,那也会很有帮助。else
(car l)
(1)
(cdr l)
(2 3)
dnewl
dproduct
dsum
newl
product
sum
但也许我太早了。第一次阅读这篇文章的初学者真的应该理解这种疯狂的延续吗?
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 - 这两个 Scheme 函数有什么区别?
- /li>
(自加) => 1
(自加) => 2
(自加) => 3
(自加) => 4
-
2.
(自加1) => 1
(自加1) => 1
(自加1) => 1
请告诉我如何理解以上两个功能之间的区别?提前非常感谢!最好的祝福。
scheme - 如何理解这种延续?
我该如何编写这个延续的执行步骤?
scheme - 我应该从 shift、align 和 shuffle 中获得什么指南?
在《The Little Schemer》第9章的开头部分,有looking、shift、align、shuffle等几个例子,
p>我想我大概理解了它们,但我不知道这些例子的提示,我是否需要有一些先决条件,有人可以告诉我吗?
最好的祝福