标签: sicp

3
推荐指数
1
解决办法
1214
查看次数

了解评估的环境模型

SICP 中的练习 3.20:

绘制环境图来说明表达式序列的求值

(define x (cons 1 2))
(define z (cons x x))


(set-car! (cdr z) 17)

(car x) 17
Run Code Online (Sandbox Code Playgroud)

使用上面给出的对的程序实现。

我的眼睛被毁了所以我不能画画。相反,我会尽力想象环境模型如何演变。

首先,这是程序对的实现。

(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)

evaluation scheme sicp lexical-scope

3
推荐指数
1
解决办法
459
查看次数

SICP练习1.16,我的bug在哪里,因为它看起来对我来说

我刚刚开始阅读这本书以获得乐趣; 我希望这是家庭作业,但我永远不能参加麻省理工学院,而且还有很多人比我更聪明.: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)

scheme sicp

2
推荐指数
1
解决办法
507
查看次数

为什么我在Clojure中尝试使用Simpson规则时会出现强制转换错误?

我正在尝试使用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)

eager clojure sicp lazy-evaluation

2
推荐指数
1
解决办法
322
查看次数

我正在阅读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/

> (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

lisp sicp

2
推荐指数
1
解决办法
458
查看次数

在Javascript中坚持SICP练习1.1.7

我决定尝试通过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)

javascript recursion scheme functional-programming sicp

2
推荐指数
1
解决办法
250
查看次数

当负值传递给这个abs函数时,Clojure如何产生正值?

当一个负值传递给它的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编写.

亲切的问候

scheme clojure sicp

2
推荐指数
1
解决办法
2881
查看次数

SICP cons-stream

关于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)))如果是这样,那么我们需要更多的内存?

scheme sicp cons

2
推荐指数
1
解决办法
1416
查看次数

麻省理工学院计划9.2中SICP的其余程序相当于什么?

我正在练习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整本书都在使用.

lisp scheme sicp

2
推荐指数
1
解决办法
114
查看次数

SICP练习2.04

阅读SICP我现在正在练习2.04,这是一个程序性的表示cons,carcdr在书中给出如下:

(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无济于事.

这是我的理解:

关于 cons

  • cons 返回一个函数.
  • 此功能将应用给定的参数,以两个参数另一个函数xycons.
  • 这意味着通过调用cons我们保留了将函数应用于这两个参数的可能性,并且能够将它们视为某个单元.

关于 car

  • car现在使用这样一个事实,我们可以cons通过给函数作为函数的参数将函数应用于给定的2个值的单位,我们从函数返回cons.
  • 它为该函数提供lambda表达式,该表达式始终返回两个给定值中的第一个.

用法

起初我尝试了以下方法:

(car (cons 1 2))
(car (cons 2 …
Run Code Online (Sandbox Code Playgroud)

scheme sicp cons racket

2
推荐指数
1
解决办法
64
查看次数