SICP 1.25口译员问题

时间:2018-08-03 20:32:07

标签: scheme lisp racket sicp

1)DrRacket

2)https://inst.eecs.berkeley.edu/~cs61a/sp15/assets/interpreter/scheme.html

将以上两个解释器与参数为(expmod 11 17 17)的Hacker版本一起使用会产生不同的答案。对于DrRacket为11(根据程序应为),对于inst.eecs.berkeley.edu为0

底部包含一个示例评估。在使用inst.eecs.berkeley.edu时,将所有(< base m)都替换为两个解释器将产生不同的答案,因此使该解释器的整个定时素数测试失败。

我的问题:该解释器的根本问题是什么?这是由于解释错误引起的吗?两者之间的评估方法不同?

(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的链接

https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-11.html#call_footnote_Temp_78

1 个答案:

答案 0 :(得分:2)

因此,尽管DrRacket具有SICP language,但SICP代码应在其中起作用Racket的默认语言与Scheme不兼容。两者接近,因此这两种语言比Java和C#具有更多的共同点,但是它们被公认是不同的语言。 球拍支持Scheme。 #!r5rs#!r6rs

您的在线解释器可能仅具有基本的Scheme功能,也许只有浮点数。仅R7RS需要完整的数字塔,因此大的数字可能会变成浮点数。我进行的一项非常简单的测试表明,该数字变得非常不精确:

(/ 1 2) ; ==> 0.5

使用完整的数字塔,答案将是有理确切数字1/2。评估call/ccexact->inexact给出了一个错误,因此解释器不满足标准方案报告的要求。

您需要阅读chosen implementation的文档和功能,因为您的程序可能依赖于并非处处包含的功能。如果我实现的卷曲语言基本支持某些Java绑定,那么它将仍然不是Java实现,因为它是不完整的。