Мы имеем дело с представлением данных в моем классе, и нам пришлось представлять целые числа в виде деревьев различий.Для моего это ноль?Я хочу на самом деле оценить 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
)))