Как мне оценить процедуру, которая возвращается как символ - PullRequest
1 голос
/ 14 сентября 2011

Мы имеем дело с представлением данных в моем классе, и нам пришлось представлять целые числа в виде деревьев различий.Для моего это ноль?Я хочу на самом деле оценить diff-дерево, чтобы увидеть, получится ли оно равным 0. Однако все мои процедуры возвращают символы.Я не знаю, как заставить Схему оценить процедуры.

diff-tree :: = (one) |(diff diff-tree diff-tree)

(предшественник '(один)) = (diff (один) (один))

Так что если у меня есть (is-zero? (predecessor '(one))) | примечание: оно имеетчтобы принять его как символ

, он будет оцениваться как (is-zero? '(diff (one) (one))), как мне его получить, чтобы я мог реально оценить diff как функцию?У меня уже есть (определить diff -) (определить (один) 1), поэтому, если я просто запустить (diff (один) (один))

Все другие функции, такие как предшественник, должны вернуть символ.

Я не очень хорош в объяснении, но я надеюсь, что проделал достаточно хорошую работу, чтобы люди могли понять.

ПРИМЕЧАНИЕ: я создал другую функцию, которая рекурсивно проходит через diffдерево и оценивает его.Это не так хорошо, как хотелось бы, но это будет работать.

(define evaluate
  (lambda (dt)
    (if (eqv? (car dt) 'diff)
        (- (evaluate (cadr dt))(evaluate (caddr dt)))
        1
        )))
(define is-zero?
  (lambda (dt)
    (if (= 0 (evaluate dt))
        #t
        #f
     )))

Ответы [ 2 ]

0 голосов
/ 15 сентября 2011

Мне кажется, что идея этого задания заключается в том, чтобы вы либо разработали интерпретатор для diff-деревьев, либо (учитывая "интересную" спецификацию) разработать функции, которые выполняют алгебраические манипуляции над деревьями, которые сохраняют " то есть. "

Предполагая, что все в порядке, просто напишите интерпретатор, который возвращает целое число - это ясно, что вы имеете в виду - вам нужно разработать прямую (из соответствующей HtDP глава) функцию на части самоссылочных составных данных "(т. е. ваши различные деревья). Он начинается с выбора имени и контракта для вашей «интерпретирующей» функции. Тогда как насчет некоторых тестовых случаев?

0 голосов
/ 14 сентября 2011

Это эскиз, нет доступа к компилятору Scheme:).

(define (list-eval l)
  (apply (car l) (map list-eval (cdr l))))

(define (is-zero? l)
  (= 0 (list-eval l)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...