有人在课堂上使用过http://www.neilvandyke.org/racket-sicp吗?是否足够成熟?
SICP 中的练习 3.20:
绘制环境图来说明表达式序列的求值
Run Code Online (Sandbox Code Playgroud)(define x (cons 1 2)) (define z (cons x x)) (set-car! (cdr z) 17) (car x) 17使用上面给出的对的程序实现。
我的眼睛被毁了所以我不能画画。相反,我会尽力想象环境模型如何演变。
首先,这是程序对的实现。
(define (cons x y)
(define (set-x! v) (set! x v))
(define (set-y! v) (set! y v))
(define (dispatch m)
(cond ((eq? m 'car) x)
((eq? m 'cdr) y)
((eq? m 'set-car!) set-x!)
((eq? m 'set-cdr!) set-y!)
(else (error "Undefined
operation: CONS" m))))
dispatch)
(define (car z) (z 'car))
(define (cdr z) (z 'cdr))
(define (set-car! z …Run Code Online (Sandbox Code Playgroud) 我刚刚开始阅读这本书以获得乐趣; 我希望这是家庭作业,但我永远不能参加麻省理工学院,而且还有很多人比我更聪明.:p
fast-exp应该找到b ^ n,即4 ^ 2 = 16,3 ^ 3 = 27
(define (fast-exp b n)
(define (fast-exp-iter n-prime a)
(cond ((= n-prime 1) a)
((= (remainder n-prime 2) 1) (fast-exp-iter (- n-prime 1) (* a b)))
(else (fast-exp-iter (/ n-prime 2) (* a b b)))))
(fast-exp-iter n 1))
fast-exp 4 2; Expected 16, Actual 2
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Clojure完成SICP中的一些练习,但是我现在执行Simpson规则的方法出错(例如1-29).这与懒惰/急切的评估有关吗?有想法该怎么解决这个吗?错误和代码如下:
java.lang.ClassCastException:用户$ simpson $ h__1445无法在clojure.lang.Numbers.divide(Numbers.java:139)中强制转换为java.lang.Number
这是代码:
(defn simpson [f a b n]
(defn h [] (/ (- b a) n))
(defn simpson-term [k]
(defn y [] (f (+ a (* k h))))
(cond
(= k 0) y
(= k n) y
(even? k) (* 2 y)
:else (* 4 y)))
(* (/ h 3)
(sum simpson-term 0 inc n)))
Run Code Online (Sandbox Code Playgroud) 这是书......
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/
> (define (square x) (* x x))
*** EVAL Error: Function 'DEFINE' is not defined. ***
Run Code Online (Sandbox Code Playgroud)
还尝试使用具有类似结果的'lispbox'.
啊哈:http : //sisc-scheme.org/sisc-online.php工作,谢谢你的提示blabla999,很快就会接受回答.
进一步研究:Scheme!= Common Lisp
我决定尝试通过MIT SICP课程,但是在Javascript中.
以下代码输出undefined,但它应该输出相当准确的5的平方根猜测.
我已经测试了所有较小的函数,它们都按预期工作,问题必须在递归guessRoot()函数中的某个地方,但我似乎无法看到问题.
var square = function(x) {
return x * x;
};
var abs = function(x) {
return x > 0 ? x : -x;
};
var goodEnough = function(g, x) {
return abs(square(g) - x) < 0.01;
};
var average = function(x, y) {
return (x + y) / 2;
};
var improve = function(g, x) {
return average(g, (x / g));
};
var guessRoot = function(guess, x) {
if (goodEnough(guess, x)) {
return guess;
} else …Run Code Online (Sandbox Code Playgroud) 当一个负值传递给它的x参数时,它一直在唠叨cond如何在函数中返回正值.我的想法是两个负数乘以产生一个正数,但这看起来很混乱,因为在函数的任何地方似乎都没有出现乘法.
有人能给我详细解释为什么传递给x的负值会返回正值吗?
(def abs
(fn [x]
(cond (> x 0) x
(= x 0) 0
(< x 0) (- x))))
(abs -10) -> 10
Run Code Online (Sandbox Code Playgroud)
代码是SICP一书中abs函数的变体,但是用Clojure编写.
亲切的问候
关于SICP 3.5
我自己的实现如下
(define (delay exp) (lambda () exp))
(define (force delayed-obj)
(delayed-obj))
(define (cons-stream a b) (cons a (delay b)))
(define (stream-car stream) (car stream))
(define (stream-cdr stream) (force (cdr stream)))
(define (take n stream)
(if (= n 0)
(print "0")
(begin (take (- n 1) (stream-cdr stream))
(print n))))
(define (make-stream-enum-interval low high)
(if (> low high)
'()
(begin (print low) (cons-stream low (make-stream-enum-interval (+ low 1) high)))))
Run Code Online (Sandbox Code Playgroud)
实际上我发现它并没有真正推迟.当我执行时(定义范围-10到100(make-stream-enum-interval 10 100)).我希望在控制台中只能打印10个.虽然它是10 ..... 100
我的代码有什么问题吗?或者,如果需要打印10 ... 100,那么我们可以说结构是(缺点10(延迟缺点11(延迟缺点12(延迟...... 100)))如果是这样,那么我们需要更多的内存?
我正在练习2.32,它提供了以下代码:
(define (subsets s)
(if (null? s)
(list nil)
(let ((rest (subsets (cdr s))))
(append rest (map <??> rest)))))
Run Code Online (Sandbox Code Playgroud)
当我尝试rest在MIT Scheme 9.2中调用该过程时,它无法识别该过程(nil书中存在类似的问题,()在现代Scheme中被替换).rest现代计划中的等效程序是什么?我不相信这是cdr因为cdr整本书都在使用.
阅读SICP我现在正在练习2.04,这是一个程序性的表示cons,car并cdr在书中给出如下:
(define (cons x y)
(lambda (m)
(m x y)))
(define (car z)
(z
(lambda (p q)
(p))))
Run Code Online (Sandbox Code Playgroud)
注意,为了运行我在代码中使用racket以下前导码的代码:
#lang racket
(define (Mb-to-B n) (* n 1024 1024))
(define MAX-BYTES (Mb-to-B 64))
(custodian-limit-memory (current-custodian) MAX-BYTES)
Run Code Online (Sandbox Code Playgroud)
我也试着#lang scheme无济于事.
这是我的理解:
conscons 返回一个函数.x和y的cons.cons我们保留了将函数应用于这两个参数的可能性,并且能够将它们视为某个单元.carcar现在使用这样一个事实,我们可以cons通过给函数作为函数的参数将函数应用于给定的2个值的单位,我们从函数返回cons.起初我尝试了以下方法:
(car (cons 1 2))
(car (cons 2 …Run Code Online (Sandbox Code Playgroud) sicp ×10
scheme ×7
clojure ×2
cons ×2
lisp ×2
racket ×2
eager ×1
evaluation ×1
javascript ×1
recursion ×1