注意:我不是在问哪个学习,哪个更好,或者类似的东西.
我拿起SICP的免费版本,因为我觉得阅读会很好(我听说过很好的东西,而且我对这种编程方面很感兴趣).
我知道Scheme是Lisp的一种方言,我想知道:Scheme和Common Lisp之间的实际区别是什么?
似乎有很多关于'CL有一个更大的stdlib ...方案对现实世界的编程不好......'但实际上并没有说'这是因为CL就是这个/有这个'.
我一直在使用PLT Scheme,但它有一些问题.有没有人知道通过SICP更好的实施?
我刚刚开始通过SICP(我自己;这不适合一个班级),我已经在练习1.6中苦苦挣扎了几天,我似乎无法弄明白.这是Alyssa重新定义if的方式cond,如下所示:
(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause))
Run Code Online (Sandbox Code Playgroud)
她在一些简单的情况下成功测试它,然后用它来重新编写平方根程序(它工作得很好if):
(define (sqrt-iter guess x)
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
Run Code Online (Sandbox Code Playgroud)
然后问题是:"当Alyssa试图用它来计算平方根时会发生什么?解释." [如果有必要,我很高兴能重现其他程序(good-enough?,improve,等),只是让我知道.]
现在,我知道会发生什么:它永远不会返回一个值,这意味着程序无限地递归.我无法解释为什么会这样.无论之间存在什么微妙的差异,if并且new-if正在逃避我.任何和所有帮助非常感谢.
另外,即使我可以使用Common Lisp,我应该吗?方案更好吗?
我抓住了学习函数式编程的bug.所以我的下一个自学项目是通过计算机程序的结构和解释.不幸的是,我从未学过Lisp,因为我不是大学的CS专业.
虽然SICP并不强调编程工具,但是练习需要选择一种类似Lisp的语言.似乎Scheme的一些实现将是阻力最小的路径.另一方面,我听说有人使用过Common Lisp和Clojure.在我看来,Common Lisp或Clojure更有可能在生产代码中使用,因此我的简历稍微好一点.顺便说一下,我完全认为学习语言本身就是值得的,但学习一种帮助我简历的语言仍然是一个好处.我是资本家,也是关于我学习的学者.
如果你不得不自学SICP,你会选择哪种语言?为什么?理想情况下,我想使用可以在JVM上运行的语言.我当然可以使用REPL与bash和emacs一起工作的语言.
附加:有没有人试过不使用Scheme阅读SICP?如果是这样,你的经历是什么样的?
我正在通过SICP工作.目前,在第一章中,我遇到了让Racket重新定义"原语"的问题.例如,我的印象是我应该可以任意做(define + 5),这样就可以了,或重新定义sqrt程序.相反,我明白了:
define-values: cannot change constant variable: +
Run Code Online (Sandbox Code Playgroud)
我的语言目前设置为R5RS,我认为这样可以解决与SICP的兼容性问题.
我正在尝试使用SICP,我得到了一些代码.所以我开始:
#lang scheme
(word 'comp 'uter)
Run Code Online (Sandbox Code Playgroud)
返回错误:函数(字)未定义.
即使我试图将其复制到IDE(运行):
(define word?
(let ((number? number?)
(symbol? symbol?)
(string? string?))
(lambda (x)
(or (symbol? x) (number? x) (string? x)))))
Run Code Online (Sandbox Code Playgroud)
还是一样.
我认为这可能是语言版本的某些问题或者其他问题.
以上是"简单方案",当我在SICP中引入代码时:
(define (sqrt x)
(sqrt-iter 1.0 x))
Run Code Online (Sandbox Code Playgroud)
IDE返回sqrt-iterundefined.代码可以在第一章找到:http://mitpress.mit.edu/sicp/code/index.html
函数
f由f(n) = nifn < 3和f(n) = f(n - 1) + 2f(n - 2) + 3f(n - 3)if 的规则定义n > 3.编写一个f通过递归过程计算的过程.编写一个f通过迭代过程计算的过程.
递归地实现它很简单.但我无法弄清楚如何迭代地做到这一点.我尝试与给出的Fibonacci示例进行比较,但我不知道如何将其用作类比.所以我放弃了(羞辱我)并用Google搜索解释,我发现了这个:
(define (f n)
(if (< n 3)
n
(f-iter 2 1 0 n)))
(define (f-iter a b c count)
(if (< count 3)
a
(f-iter (+ a (* 2 b) (* 3 c))
a
b
(- count 1))))
Run Code Online (Sandbox Code Playgroud)
阅读之后,我理解代码及其工作原理.但我不明白的是从函数的递归定义到此需要的过程.我不明白代码是如何在某个人的头脑中形成的.
你能解释一下解决方案所需的思考过程吗?
根据SICP第1.2.6节,练习1.22:
大多数Lisp实现包括一个名为runtime的原语,它返回一个整数,指定系统运行的时间(例如,以微秒为单位测量).
我正在使用DrScheme,运行时似乎不可用,所以我正在寻找一个好的替代品.我在PLT-Scheme Reference中发现有一个current-milliseconds原语.有谁知道Scheme中的计时器是否具有更好的分辨率?
谁能告诉我mit-scheme中的空值表示是什么?在SICP书中,它应该是"零"但它不起作用.谢谢.
sicp ×10
scheme ×9
lisp ×6
racket ×3
common-lisp ×2
recursion ×2
clojure ×1
dr.racket ×1
iteration ×1
mit-scheme ×1