在" 计算机程序的结构和解释"第3.2部分中,"环境"被定义为"一系列帧".但据我所知,本书没有进一步讨论环境与框架之间的区别.此外,我怀疑环境图纸将它们与框架混为一谈,因为书籍图纸很小而且是2-D,并且不容易显示时间演变而不是另一幅完整图纸.
因此,将创建时的环境视为与第一帧相同是否正确?然后,当环境中发生任何更改(现有绑定发生更改,创建了新绑定)时,环境会在其帧序列中添加新帧?如果这种理解不正确,那么环境与框架之间究竟有什么区别?
在此先感谢您的帮助!
这里的代码可以生成这样的数字[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中运行代码.
在 SICP 第 4 章中,通过将语法分析与执行分离来修改元循环求值器,使过程eval如下所示:
(define (eval exp env)
((analyze exp) env))
Run Code Online (Sandbox Code Playgroud)
书上说这将节省工作,因为analyze将在表达式上调用一次,而执行过程可能会被调用多次。
我的问题是,这种优化是如何进行的?它适用于递归过程调用,但其他情况又如何呢?求值器逐个求值表达式,eval即使它们具有相同的形式,仍将在每个表达式上调用。
如何在Scheme中通过流映射定义整数:
(定义整数(stream-cons 1(stream-map * something * * something *)))
我正在通过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)
我收到一条消息说:正在中止!:超出了最大递归深度.
我猜测 …
(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)?
这是与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))?
先感谢您
我正在通过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)
任何照明都非常赞赏
我一直在研究SICP的最后几个练习,其中几个练习使用高阶函数.目前我正在尝试将我的解决方案中的问题调试到1.45,这会导致arity不匹配.提高误差的功能是两次对定点函数求解器应用平均操作的结果.
它将使我调试的努力了很多容易,如果我可以只转储某种程序表示,鉴于该程序已经通过其他几个能够改变它,它会引发错误之前的程序运行.我看过对DrRacket,增加了调试文件(require racket/trace)和 (require errortrace)我的模块,我认为我熟悉的调试系统的所有功能-但我仍然不知道如何做到这一点.
DrRacket的答案是理想的,但任何事情都有帮助.
通过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每一步都在运行.