问题标签 [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.
list - 方案:当我 cons 两个原子时,我在中间得到一个点。为什么?
当我cons
对两个原子做 a 时,我.
在两者之间得到 a。
为什么我要找.
运营商。它有什么意义吗?我正在使用mit-scheme
.
我看过这个 stackoverflow 链接,但不清楚。
更新:Little Schemercons
中的定义指出,
接受两个参数,第一个是任何 S 表达式,第二个是任何列表。cons
recursion - 方案:是否可以将 S 表达式列表转换为原子列表?
我正在尝试将 S 表达式列表转换为类似于The Little Schemer书中的问题的简单原子列表。
我的代码是(在 Dr.Racket 中输入):
上面的代码返回与输入列表相同的列表。我尽力了,但得到不同的答案,例如:
用于程序中的各种修改。
我想知道,我们能不能得到答案:
给定
通过使用cond
cons
car
并且cdr
仅.
recursion - 递归期间在Scheme中创建封闭过程对性能的影响
我正在阅读The Little Schemer这本书,开始学习用 Lisp 进行思考。当你进入它并真正涵盖了 lambdas 的使用时,'remove' 过程以以下一般形式编写,它返回一个用于任意 test 的删除过程test?
:
我理解它是如何工作的,但简单的阅读表明,在每个递归步骤中,rember-f
再次调用该过程以生成一个新的封闭过程。这意味着当您在列表上调用返回的过程时,它会再次调用以重新rember-f
生成相同的过程,然后该新的过程称为递归(如果不清楚,请参阅下面的修复)。我知道这可能会被优化掉,但是代替不知道它是否是(并且无论如何也试图让我了解这种语法),我在一些实验后设法将递归移动到过程本身而不是封闭程序如下:
我已经验证这可以按预期工作。返回值是一个删除与值 (arg 1) 匹配的列表 (arg 2) 的第一个元素的过程。在我看来,这个只调用rember-f
一次,这保证它只生成一个封闭的过程(这次有一个名字,retfun
)。
这对我来说实际上很有趣,因为与通常的尾调用优化不同,它不消耗调用堆栈上的空间,因此使递归与迭代一样有效,在这种情况下,编译器必须确定(rember-f test?)
封闭过程范围未修改因此将其替换为相同的返回值,即匿名(lambda (a l) ...)
。得知解释器/编译器没有捕捉到这一点,我一点也不感到惊讶。
是的,我知道方案是一种规范,并且有许多实现,它们在不同程度上获得了各种函数式编程优化。我目前正在通过在 guile REPL 中进行实验来学习,但会对不同的实现在这个问题上的比较感兴趣。
有谁知道 Scheme在这种情况下应该如何表现?
scheme - 有来自 The Little Schemer 的“对齐”功能的示例吗?
在The Little Schemer的第 9 章中:
书中大部分函数都有例子,例子一般都有详细的讲解,但没有这个函数。
我不明白如何使用这个功能,所以我无法理解后面的功能。我在网上找不到此功能的示例。
你能给我看一些例子吗?
scheme - Little Schemer 中的 `quote` 有歧义。什么时候应该在表达式中加上引号,什么时候不应该?
Friedman 和 Felleisen 的 Little Schemer 4e 首先定义atom?
:
然后在第一章中,有一些问题询问某某是否是一个原子。例如(为了清楚起见,脚注被改写):
这是一个原子是真的吗?
atom
**在方案中:
(quote atom)
或'atom
它说turkey
, 1492
, u
,*abc$
也是原子。
所有这些 except1492
必须在前面加上'
- 否则我们会得到一个Error: execute: unbound symbol:
1492
两者'1492
都有效。从今以后,在这本书中,我怎么知道什么时候应该或不应该在某些东西前面加上引号('
)???这很令人困惑。'
我希望作者只是明确地引用了引号——在表达式前面加上一个单引号 ( ) 真的会增加那么多视觉噪音吗?我是否应该假设所有内容都以引号 ( '
) 开头?
null - 在 Scheme 中,`nil` 和 `null` 有什么区别?
在“The Little Schemer”中,null
用来指代空列表()
。但我也看到了 Scheme 的错误消息中提到的空列表nil
,例如:
(car ())
原因:
Error: Attempt to apply car on nil [car]
[1]
这听起来像是指的是()
as nil
。
[1] 使用replit.com 的BiwaScheme Interpreter 0.6.4 版
这个问题类似于What is the exact difference between null and null in common lisp。nil
这是不同的,因为正如这里的答案所指出的那样,Common Lisp 和 Scheme 在处理和方面存在差异null
。
scheme - 为什么“The Little Schemer”坚持 `cons` 的第二个参数必须是一个列表?
《小谋士》:
缺点法则
...
第二个参数 tocons
必须是一个列表。
另外,《小计谋者》:
什么在
(cons s l)
哪里s
_'a
_l
'b
没有答案。
为什么?
但是,如果我真的这样做了,(cons 'a 'b)
我'(a . b)
知道它不是一个列表,但它是有效的 - 有一个答案 - 它是一对......