在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专家都能对这方面的缺点有所了解吗?提前感谢您的任何见解.
必须根据以下价值决定:
(测试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使用申请订单评估.
我的问题涉及以下代码:
(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的值究竟来自哪里?
除了质疑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)
它进入无限循环,使我认为"如果"使用应用程序订单评估.那我在哪里错了?
在货币上的SICP第3.4节(方案中的序列化器)中,有一个称为并行执行的过程,该过程在MIT方案中描述但未实现.我想知道是否有人实际实施过它; 如果不是如何开始实施这样的程序?
http://mitpress.mit.edu/sicp/full-text/book/book-ZH-23.html#%_sec_3.4.1
这不是一个功课问题,我只是对我对间隔算术的理解以及练习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) 我试图解决计算机编程结构和解释问题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.
SICP练习3.57:当我们根据加流过程使用fib的定义来计算第n个斐波那契数时,要执行多少次加法运算?证明如果不使用3.5.1中描述的备忘录过程提供的优化而简单地将(delay?exp?)实现为(lambda()?exp?),加法运算的数量将成倍增加。
在线上有许多解决方案。大多数人声称,fib序列的非优化备忘-proc序列版本与计算非存储的常规fib函数相同。当跟踪未优化的备忘版本时,我看到了一个不同的故事。
令A(n)为(stream-ref fibs n)执行的加法数
当在非优化(非存储流)上使用替换和函数定义时,我可以确切地看到这些加法是什么以及为什么会发生这些加法,但是我很难提出一个好的方程式来回答实际上是指数的。
例如,针对A(4)跟踪的加法为:
这是一些伪代码,用于显示(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) 我正在通过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)
我收到一条消息说:正在中止!:超出了最大递归深度.
我猜测 …
我正在通过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)
任何照明都非常赞赏