1) DrRacket
2) https://inst.eecs.berkeley.edu/~cs61a/sp15/assets/interpreter/scheme.html
Использование обоих интерпретаторов выше для версии Хакера с аргументами (expmod 11 17 17)
дает разные ответы. 11 для DrRacket (в соответствии с процедурой) и 0 для inst.eecs.berkeley.edu
Внизу включен пример оценки. Подстановка всех (< base m)
в оба интерпретатора дает разные ответы при использовании inst.eecs.berkeley.edu и, следовательно, приводит к сбою всего timed-prime-test для этого интерпретатора.
Мой вопрос: в чем заключается основная проблема этого интерпретатора? Это проблема из-за ошибки в интерпретации? Другой метод оценки между ними?
(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 имеет Язык SICP, где должен работать код SICP, язык Racket по умолчанию несовместим со Scheme. Это близко, так что у этих двух языков больше общего, чем у Java и C#, но их следует признать разными языками.
Racket поддерживает Scheme. И #!r5rs
, и #!r6rs
.
Ваш онлайн-переводчик может иметь только базовую функциональность схемы и, возможно, только числа с плавающей запятой. Только для R7RS требуется полная числовая башня, поэтому большие числа могут стать плавающими. Проведенный мною очень простой тест показал, что число очень быстро стало неточным:
(/ 1 2) ; ==> 0.5
С полной числовой башней ответом будет рациональное точное число 1/2
. Оценка call/cc
и exact->inexact
дала ошибку, поэтому интерпретатор не соответствует требованиям для стандартных отчетов схемы.
Вам необходимо прочитать документацию и функции вашего выбранная реализация, поскольку ваша программа может зависеть от функций, которые не везде включены. Если бы я реализовал фигурный язык с элементарной поддержкой некоторых привязок Java, он все равно не был бы реализацией Java, поскольку был бы неполным.
Обратите внимание, что
expmod
сначала вычисляет мощностьp=base^exp
, а затем находит модуль. Это означает, что временный результатp
может быть очень большим. Настолько велик, что не может быть точно представлен с помощью чисел с плавающей запятой. Вместо этого вы должны написать вариант вашегоfast-expt
, который вычисляет по модулю каждого временного результата. Таким образом, все числа в вычислении будут ниже модуля - и вы получите правильный результат также в реализации схемы Беркли.