问题标签 [sicp]
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.
functional-programming - 赋值语句 - 被认为是有害的?
我看到Bob 叔叔谈论SICP 书和作业陈述的视频,它让我思考(并阅读了 SICP 的相应章节)。
我想知道列出的论点(本地状态、副作用等),考虑到第一版是在1984年出版的,在 Java 和 C# 等现代语言中仍然是一个问题。那时候可能有问题。现在还在吗?或者有什么改变?
例如,在 Java 中,我们有不可变 String
的 s。我能想到的一个特定领域是分配是有害的(如果我错了,请纠正我)。没有分配意味着没有同步,也没有资源死锁,对吧?
scheme - 将 r5rs 文件包含到球拍中的另一个文件中
我的一门课程是在 SICP 的某些部分使用 DrRacket。我们正在研究元循环评估器,我有一个 R5RS 代码文件 (set-car!
和set-cdr!
),我需要在我的工作中使用它。因为 R5RS 文件大约有 500 行,所以我更愿意将它保存在单独的缓冲区中。如何将它包含在我的答案缓冲区的定义中?它似乎racket/include
需要,#lang racket
但不是那种语言。set-car!
set-cdr!
lisp - SICP 练习 3.8 - 为什么该程序有效?(我认为是环境问题)
SICP中的练习3.8被描述为blow:
当我们在 1.1.3 节定义评估模型时,我们说过评估表达式的第一步是评估其子表达式。但是我们从未指定子表达式的求值顺序(例如,从左到右或从右到左)。当我们引入赋值时,评估过程参数的顺序会对结果产生影响。定义一个简单的过程 f,如果 + (+ (f 0) (f 1)) 的参数从左到右计算,则计算 (+ (f 0) (f 1)) 将返回 0,但如果参数从右到左计算,则返回 1。
我编写了这个过程f
,这样如果我(f x)
先调用,它就会x
在我f
再次调用时返回。但我不知道它为什么起作用。我写的程序是:
lisp - 我正在阅读 SICP 并试图跟进,但为什么我在网上找到的 Lisp 解释器使用 DEFINE 关键字失败?
这是书...
http://mitpress.mit.edu/sicp/full-text/book/book.html
知道我应该使用哪个解释器来处理这里提供的代码吗?
到目前为止,我已经尝试了一些在线并下载了 Lisp 解释器,但当我尝试使用 DEFINE 时,我得到的只是错误。
例子:
从本节开始:http: //mitpress.mit.edu/sicp/full-text/book/book-ZH-10.html#%_sec_1.1
放在这里:http ://www.ugcs.caltech.edu/~rona/tlisp/
还尝试使用 'lispbox' 得到类似的结果。
啊哈:http: //sisc-scheme.org/sisc-online.php有效,感谢 blabla999 的提示,很快就会接受答案。
经过进一步研究:Scheme != Common Lisp
lisp - SICP 3.4节中互斥锁的实现
当作者实现序列化程序的互斥部分时,他们使用了一个名为cell
. 但是列表只包含一个元素,那么为什么不只使用一个变量呢?
lisp - 难以表示和理解集合
具体集合的概念参考这里: http: //mitpress.mit.edu/sicp/full-text/book/book-ZH-16.html#%_sec_2.3.3
我了解数据结构如何工作以及如何遍历它们,但它的使用更难以概念化。
有人介意用不同的词来解释它,也许这可能会帮助它点击。非常感谢。
language-agnostic - 自然数的 Church 数字编码是否不必要地复杂?
我一直在阅读的《计算机程序的结构和解释》一书通过定义零和增量函数来介绍 Church 数字
这对我来说似乎很复杂,我花了很长时间才弄清楚并推导出一个 ( λf.λx. f x
) 和两个 ( λf.λx. f (f x)
)。
用这种方式编码数字不是更简单吗,零是空的 lambda?
现在很容易推导出一个 ( λ. λ
) 和两个 ( λ. λ. λ
),依此类推。
这似乎是用 lambda 表示数字的一种更直接、更直观的方式。这种方法是否存在问题,因此有充分的理由说明教堂数字以它们的方式工作吗?这种方法是否已经得到证实?
scheme - Mit-Scheme中的空值?
谁能告诉我 mit-scheme 中的空值表示是什么?在 SICP 书中,它应该是“nil”,但它不起作用。谢谢。
scheme - 为什么要将语法分析与执行分开?
在 SICP 第 4 章中,通过将语法分析与执行分离来修改元循环求值器,使eval
过程如下所示:
并且书中说这将节省工作,因为analyze
将在表达式上调用一次,而执行过程可能会被调用多次。
我的问题是,这种优化是如何工作的?它适用于递归过程调用,但其他情况呢?评估器一个接一个地评估表达式,eval
即使它们具有相同的形式,仍然会在每个表达式上被调用。
scheme - 如何以 CPS 形式编写分析器/评估器函数,如“eval-if”?
我正在尝试基于 SICP 中的元循环评估器编写一个玩具 python 方案解释器。由于 python 只支持有限深度的调用堆栈,我必须消除尾调用。我阅读了蹦床并用它实现了解析器。
但我不知道如何以连续传递风格编写分析器/评估器函数以将它们与蹦床一起使用。例如,eval-if
函数:
在蟒蛇中:
当我想检查谓词是否为真时,我必须对其进行新一轮的调用eval
。我应该如何以 CPS 形式编写这种递归调用?