Scheme SICP 1.25解释器问题

Scheme SICP 1.25解释器问题,scheme,lisp,racket,sicp,Scheme,Lisp,Racket,Sicp,1) 骗局 (二) 对于带有参数的黑客版本,使用上述两个解释器可以得到不同的答案。11表示DrRacket(按照程序),0表示inst.eecs.berkeley.edu 包括底部的示例评估。在使用inst.eecs.berkeley.edu时,将所有(incexact给出了一个错误,因此解释器不符合标准方案报告的要求 您需要阅读您的程序的文档和功能,因为您的程序可能依赖于并非所有地方都包含的功能。如果我实现了一种对一些Java绑定有基本支持的curly语言,那么它仍然不是Java实现,因为它是

1) 骗局

(二)

对于带有参数的黑客版本,使用上述两个解释器可以得到不同的答案。11表示DrRacket(按照程序),0表示inst.eecs.berkeley.edu

包括底部的示例评估。在使用inst.eecs.berkeley.edu时,将所有
替换到两个解释器中会产生不同的答案,因此会使该解释器的整个定时素数测试失败

我的问题是:这个解释器的根本问题是什么?这个问题是由于解释错误造成的吗?两种评估方法不同

(define (expmod base exp m)
  (remainder (fast-expt base exp) m))
(define (fast-expt b n)
  (cond ((= n 0) 1)
        ((even? n) (square (fast-expt b (/ n 2))))
        (else (* b (fast-expt b (- n 1))))))
(define (even? n)
  (= (remainder n 2) 0))
(define (square x)
  (* x x))

(remainder (fast-expt 11 17) 17)
(remainder (* 11 (fast-expt 11 16)) 17)
(remainder (* 11 (square (fast-expt 11 8))) 17)
(remainder (* 11 (square (square (fast-expt 11 4)))) 17)
(remainder (* 11 (square (square (square (fast-expt 11 2))))) 17)
(remainder (* 11 (square (square (square (square (fast-expt 11 1)))))) 17)
(remainder (* 11 (square (square (square (square (* 11 (fast-expt 11 0))))))) 17)
(remainder (* 11 (square (square (square (square (* 11 1)))))) 17)
(remainder (* 11 (square (square (square (square 11))))) 17)
(remainder (* 11 (square (square (square 121)))) 17)
(remainder (* 11 (square (square 14641))) 17)
(remainder (* 11 (square 214358881)) 17)
(remainder (* 11 45949729863572161) 17)
(remainder 505447028499293771 17)
指向在线SICP的链接

因此,虽然DrRacket有一个where SICP代码应该工作,但Racket的默认语言与Scheme不兼容。这两种语言非常接近,因此它们比Java和C有更多的共同点,但它们被认为是不同的语言。 拉凯特支持这个计划。都是
#!r5rs
#!r6rs

您的在线intepreter可能只有基本的方案功能,可能只有浮点数。只有R7RS需要完整的数字塔,因此大的数字可能会变成浮点数。我做了一个非常简单的测试,结果显示数字很快变得不精确:

(/ 1 2) ; ==> 0.5
对于一个完整的数字塔,答案将是有理精确数
1/2
。Evalutation
call/cc
,和
exact->incexact
给出了一个错误,因此解释器不符合标准方案报告的要求


您需要阅读您的程序的文档和功能,因为您的程序可能依赖于并非所有地方都包含的功能。如果我实现了一种对一些Java绑定有基本支持的curly语言,那么它仍然不是Java实现,因为它是不完整的。

请注意,
expmod
首先计算幂
p=base^exp
,然后找到模。这意味着临时结果
p
可能非常大。太大了以至于不能用浮点精确表示。相反,您必须编写一个
fast expt
的变体,用于计算每个临时结果的模。通过这种方式,计算中的所有数字都将低于模-并且在Berkeley方案实现中也将得到正确的结果。