标签: sicp

在SICP 3.2中,环境评估模型是一个最初与第一帧相同的环境?

在" 计算机程序结构和解释"第3.2部分中,"环境"被定义为"一系列帧".但据我所知,本书没有进一步讨论环境与框架之间的区别.此外,我怀疑环境图纸将它们与框架混为一谈,因为书籍图纸很小而且是2-D,并且不容易显示时间演变而不是另一幅完整图纸.

因此,将创建时的环境视为与第一帧相同是否正确?然后,当环境中发生任何更改(现有绑定发生更改,创建了新绑定)时,环境会在其帧序列中添加新帧?如果这种理解不正确,那么环境与框架之间究竟有什么区别

在此先感谢您的帮助!

lisp scheme sicp

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

使用流生成带有交替符号的数字的更好解释

这里的代码可以生成这样的数字[1 -2 3 -4 5 -6 7 -8 9 -10 ...]

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

我不太了解它产生交替标志的方式.有人可以给我一个更好的描述来帮助我想象这个吗?

您可以在mit-scheme中运行代码.

scheme sicp mit-scheme

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

为什么将语法分析与执行分开?

在 SICP 第 4 章中,通过将语法分析与执行分离来修改元循环求值器,使过程eval如下所示:

(define (eval exp env)
    ((analyze exp) env))
Run Code Online (Sandbox Code Playgroud)

书上说这将节省工作,因为analyze将在表达式上调用一次,而执行过程可能会被调用多次。

我的问题是,这种优化是如何进行的?它适用于递归过程调用,但其他情况又如何呢?求值器逐个求值表达式,eval即使它们具有相同的形式,仍将在每个表达式上调用。

scheme sicp

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

方案中的流-通过方案中的流图定义整数

如何在Scheme中通过流映射定义整数:

(定义整数(stream-cons 1(stream-map * something * * something *)))

scheme stream sicp lazy-sequences racket

5
推荐指数
2
解决办法
2913
查看次数

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
查看次数

方案何时评估报价?

(car ''abracadabra)相当于(car (quote (quote abracadabra)),它的结果是(car (quote abracadabra))- >quote

在另一方面(car (quote (a b)))评估a,这对我来说是直观的.

所以我的问题是,为什么Scheme不评估第二个引用(car (quote (quote abracadabra))(即评估(car (quote abracadabra))(car abracadabra)),但是评估报价(car (quote (a b)))(即为什么不是答案quote)?

lisp scheme sicp

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

SICP无限流(第3.5.2节)

这是与SICP Book Chapter 3.5.2相关的问题.

我正在用其他编程语言实现流数据结构.而且我不确定我是否正确理解以下代码段.

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

从我所理解的(integers-starting-from (+ n 1))将执行通过执行返回值的函数(cons-stream n (integers-starting-from (+ n 1)))).因为cons-streamis 的第二个形式参数(integers-starting-from (+ n 1)),并且因为它被包围( ),所以它将无限地一次又一次地执行该函数而不是延迟执行.

从我在执行这个片段之前看到的情况看来,即使是正在执行的流的秒元素,以下整数也会导致无限递归.

为什么这似乎适用于演讲期间所示的计划?

根据我的理解,它应该写成这样的东西:

(define (integers-starting-from n)
    (cons-stream n (lambda() (integers-starting-from (+ n 1)))))

(define integers (integers-starting-from 1))
Run Code Online (Sandbox Code Playgroud)

这是否意味着该方案有一些延迟执行的魔法(integers-starting-from (+ n 1))

先感谢您

lisp scheme stream sicp

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

不了解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
查看次数

使用trace在球拍中显示一个程序

我一直在研究SICP的最后几个练习,其中几个练习使用高阶函数.目前我正在尝试将我的解决方案中的问题调试到1.45,这会导致arity不匹配.提高误差的功能是两次对定点函数求解器应用平均操作的结果.

它将使我调试的努力了很多容易,如果我可以只转储某种程序表示,鉴于该程序已经通过其他几个能够改变它,它会引发错误之前的程序运行.我看过对DrRacket,增加了调试文件(require racket/trace)(require errortrace)我的模块,我认为我熟悉的调试系统的所有功能-但我仍然不知道如何做到这一点.

DrRacket的答案是理想的,但任何事情都有帮助.

scheme sicp racket

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

迭代过程与递归过程

通过SICP阅读Distilled并尝试围绕迭代与递归过程.给出的例子是:

(defn + [a b]
  (if (= a 0) b (inc (+ (dec a) b))))

(defn + [a b]
  (if (= a 0) b (+ (dec a) (inc b))))
Run Code Online (Sandbox Code Playgroud)

这些这是一个反复的过程(状态由参数完全保持迭代功能),这是一个递归过程(状态必须保留"背后的幕后"在等待前面的函数调用来完成.

猜测这里是第二个是迭代的,因为参数可以被评估之前的参数应用到的功能,而前者则要保持堆栈等待最后上的连续函数调用+操作完成,然后才能展开堆栈,inc每一步都在运行.

recursion tail-recursion clojure sicp

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