标签: sicp

在使用DrScheme的SICP练习2.26中,为什么cons会返回一个列表,而不是一对列表?

在SICP练习2.26中,给出了这个方案代码:

(define x (list 1 2 3))
(define y (list 4 5 6))
Run Code Online (Sandbox Code Playgroud)

然后给出这个利弊电话:

(cons x y)
Run Code Online (Sandbox Code Playgroud)

我预计会产生一对列表,((1 2 3) (4 5 6))但解释器会给出 ((1 2 3) 4 5 6) 一个包含4个元素的列表,第一个是列表.为什么y对待不同?我已经尝试查找其他SICP答案的解释,但找不到令人满意的东西.那么,任何Scheme/Lisp专家都能对这方面的缺点有所了解吗?提前感谢您的任何见解.

scheme sicp

6
推荐指数
2
解决办法
973
查看次数

DrRacket口译员是否使用基于SICP练习1.5的正常顺序评估?

必须根据以下价值决定:

(测试0(p))

测试定义为:

(define (test x y)
  (if (= x 0)
      0
      y))
Run Code Online (Sandbox Code Playgroud)

和p定义为:

(define (p) (p))
Run Code Online (Sandbox Code Playgroud)

当我评估(test 0 (p))解释器进入无限循环时,表明它正在评估p.这显示了正常顺序评估,因为在替换参数之前评估操作数.SICP表示LISP使用申请订单评估.

lisp scheme sicp racket

6
推荐指数
1
解决办法
1361
查看次数

使用lambdas帮助理解方案中的cons和car的实现

我的问题涉及以下代码:

 (define (cons. x y)
   (lambda (m) (m x y)))

 (define (car. z)
   (z (lambda (p q) p)))
Run Code Online (Sandbox Code Playgroud)

我的问题是这个代码实际上是如何工作的.据我所知,利弊.正在返回一个包含其范围内的变量x和y的过程.汽车.然后从cons中获取返回的过程.并将其应用于另一个带有两个参数p和q并返回p的lambda.我的困惑在于第二个lambda,P和Q的值究竟来自哪里?

lambda scheme sicp

6
推荐指数
1
解决办法
510
查看次数

SICP练习1.5和1.6

除了质疑SICP中练习1.6的解释是什么?.所以,Racket博士(R5RS)在有限时间内用"if"评估sqrt-iter函数,清楚地显示正常的订单评估.但是,如果我使用练习1.5的例子

(define (p) (p))
(define (test x y)
  (if (= x 0)
      0
      y))
(test 0 (p))
Run Code Online (Sandbox Code Playgroud)

它进入无限循环,使我认为"如果"使用应用程序订单评估.那我在哪里错了?

scheme sicp racket r5rs

6
推荐指数
1
解决办法
741
查看次数

在方案中实现并行执行

在货币上的SICP第3.4节(方案中的序列化器)中,有一个称为并行执行的过程,该过程在MIT方案中描述但未实现.我想知道是否有人实际实施过它; 如果不是如何开始实施这样的程序?

http://mitpress.mit.edu/sicp/full-text/book/book-ZH-23.html#%_sec_3.4.1

concurrency scheme sicp

6
推荐指数
2
解决办法
1538
查看次数

SICP 2.16区间算术(方案)

这不是一个功课问题,我只是对我对间隔算术的理解以及练习2.16的含义不满意.

由2.14节定义的区间算术不具有正常算术的属性.两个应该是等效的操作,(r1*r2)/(r1 + r2)和1 /(1/r1 + 1/r2),给出不同的结果.练习询问为什么会出现这种情况,并且如果有可能构造一个间隔算术系统,而不是这种情况.

本节讨论计算电气元件电阻的误差范围.我不确定我理解用这些术语来表示乘法和除法间隔是什么意思.将两个区间相乘的应用是什么?

在这个例子中是否可以构造一个没有问题的区间运算系统?

http://mitpress.mit.edu/sicp/full-text/book/book-ZH-14.html#%_sec_2.1.4

(define (make-interval a b)
  (cons a b))

(define (make-center-width c w)
  (make-interval (- c w) (+ c w)))

(define (make-center-percent c p)
  (make-center-width c (* c (/ p 100.0))))

(define (lower-bound i)
  (car i))

(define (upper-bound i)
  (cdr i))

(define (center i)
  (/ (+ (upper-bound i) (lower-bound i)) 2))

(define (width i)
  (/ (- (upper-bound i) (lower-bound i)) 2))

(define (percent i)
  (* 100.0 (/ (width i) (center i))))

(define …
Run Code Online (Sandbox Code Playgroud)

algorithm scheme sicp

6
推荐指数
1
解决办法
1198
查看次数

SICP:可以或者在lisp中定义为没有gensym的语法转换?

我试图解决计算机编程结构和解释问题4.4的最后部分; 任务是实现作为句法转换.只定义了基本的句法形式; 引用,if,begin,cond,define,apply和lambda.

(或ab ... c)等于第一个真值,如果没有值,则为false.

想要接近它的方法是将例如(或abc)转换为

(if a a (if b b (if c c false)))
Run Code Online (Sandbox Code Playgroud)

这个问题是a,b和c会被评估两次,如果它们中的任何一个有副作用,可能会得到不正确的结果.所以我想要像let这样的东西

(let ((syma a)) 
     (if syma syma (let ((symb b)) 
                        (if symb symb (let ((symc c))
                                           (if (symc symc false)) )) )) )
Run Code Online (Sandbox Code Playgroud)

而这又可以通过lambda实现,如练习4.6所示.现在的问题是确定符号syma,symb和symc; 例如,如果表达式b包含对变量syma的引用,那么let将破坏绑定.因此,我们必须让syma是不在b或c中的符号.

现在我们遇到了障碍; 我能看出来这个洞的唯一方式是有符号不能一直在传递给eval任何表情.(这包括可能已被其他语法转换传入的符号).

但是因为我不能直接访问表达式,所以我不确定是否有合理的方法来生成这样的符号; 我认为Common Lisp具有用于此目的的函数gensym(这意味着在metacircular解释器中保持状态,危及任何并发使用).

我错过了什么吗?有没有办法实现或不使用gensym?我知道Scheme有它自己的hygenic宏系统,但我还没有弄清楚它是如何工作的,我不确定它是否有一个gensym underneath.

lisp macros scheme sicp

6
推荐指数
1
解决办法
693
查看次数

SICP 3.57的真正答案是什么

SICP练习3.57:当我们根据加流过程使用fib的定义来计算第n个斐波那契数时,要执行多少次加法运算?证明如果不使用3.5.1中描述的备忘录过程提供的优化而简单地将(delay?exp?)实现为(lambda()?exp?),加法运算的数量将成倍增加。

在线上有许多解决方案。大多数人声称,fib序列的非优化备忘-proc序列版本与计算非存储的常规fib函数相同。当跟踪未优化的备忘版本时,我看到了一个不同的故事。

令A(n)为(stream-ref fibs n)执行的加法数

  • A(0)= 0
  • A(1)= 0
  • A(2)= 1
  • A(3)= 3
  • A(4)= 7
  • A(5)= 14
  • A(6)= 26

当在非优化(非存储流)上使用替换和函数定义时,我可以确切地看到这些加法是什么以及为什么会发生这些加法,但是我很难提出一个好的方程式来回答实际上是指数的。

例如,针对A(4)跟踪的加法为:

  • 1 + 0
  • 1 + 0
  • 1 + 1
  • 1 + 0
  • 1 + 1
  • 1 + 0
  • 2 + 1

这是一些伪代码,用于显示(stream-ref fibs 4)的替换,其中“。” 代表中缀流约束,{e}代表承诺执行e。

(cddddr fibs)
(cddr (add-streams (cdr fibs) fibs))
(cddr (stream-map + (cdr fibs) fibs)))
(cddr ((+ 1 0) . {stream-map + (cddr fibs) (cdr fibs)}))
(cdr (stream-map + (cddr fibs) (cdr fibs)))
(cdr (stream-map + …
Run Code Online (Sandbox Code Playgroud)

lisp scheme sicp lazy-sequences racket

6
推荐指数
1
解决办法
93
查看次数

sicp cons-stream是如何实现的?

我正在通过scip的streams部分工作,并坚持如何定义流.

以下是我的代码:

(define (memo-func function)
  (let ((already-run? false)
        (result false))
    (lambda ()
      (if (not already-run?)
          (begin (set! result (function))
                 (set! already-run? true)
                 result)
          result))))


(define (delay exp)
  (memo-func (lambda () exp)))

(define (force function)
  (function))

(define the-empty-stream '())
(define (stream-null? stream) (null? stream))
(define (stream-car stream) (car stream))
(define (stream-cdr stream) (force (cdr stream)))

(define (cons-stream a b) (cons a (memo-func (lambda () b))))
Run Code Online (Sandbox Code Playgroud)

如果我按照书的描述方式定义整数:

(define (integers-starting-from n)
   (cons-stream n (integers-starting-from (+ n 1))))
(define integers (integers-starting-from 1))
Run Code Online (Sandbox Code Playgroud)

我收到一条消息说:正在中止!:超出了最大递归深度.

我猜测 …

scheme sicp

5
推荐指数
1
解决办法
2671
查看次数

不了解SICP中的计划程序

我正在通过SICP第1章"1.3用高阶程序制定抽象"

我(当前)遇到问题的部分是将程序模板(如下所示)转换为实际程序(如下所示),将其"槽"变为形式参数.我没有得到的是他们在变换过程结束时(在结束括号之前)得到下一个b的地方?

当然它只是模板中的b

无论如何,这是模板......

(define (<name> a b)
  (if (> a b)
      0
      (+ (<term> a)
         (<name> (<next> a) b))))
Run Code Online (Sandbox Code Playgroud)

这是填充参数槽后的过程

(define (sum term a next b)
  (if (> a b)
      0
      (+ (term a)
         (sum term (next a) next b))))
Run Code Online (Sandbox Code Playgroud)

任何照明都非常赞赏

syntax scheme sicp

5
推荐指数
1
解决办法
404
查看次数

标签 统计

scheme ×10

sicp ×10

lisp ×3

racket ×3

algorithm ×1

concurrency ×1

lambda ×1

lazy-sequences ×1

macros ×1

r5rs ×1

syntax ×1