Я реализовал функцию, которая принимает арифметическое выражение и возвращает значение:ракетка: (оценка т LST)
; an arithmetic expression (t) is one of the following:
; - a number
; - a list of the form '(a operator b) where a and b are arithmetic expressions
; arithmetic expression -> number
; computes the value of the arithmetic expression
(define (eval t)
(cond
[(number? t) t]
[else ((cond
[(equal? (second t) '+) +]
[(equal? (second t) '-) -]
[(equal? (second t) '*) *]
[(equal? (second t) '/) /])
(eval (first t)) (eval (third t)))]))
Он отлично работает, но, очевидно, она не может принимать константы. Так что я пытаюсь сделать, это расширить программу таким образом, что он работает на что-то вроде:
(eval '(1 + (3 * x)) (make-const 'x 3) -> 10
(eval '((3 - x) * y) ((make-const 'x 1) (make-const 'y 2)) -> 4
(eval '(1 + (y * x)) (make-const 'x 3) -> "error"
Моя идея состояла в том, чтобы определения структуры:
(define struct const (symbol number))
(define (eval. t x)
(cond
[(number? t) t]
[(symbol? t) ???]
[else ((cond
[(equal? (second t) '+) +]
[(equal? (second t) '-) -]
[(equal? (second t) '*) *]
[(equal? (second t) '/) /])
(eval. (first t) lst) (eval. (third t) lst))]))
Может кто-нибудь сказать мне, если я направился в правильном направлении и, может быть, дал мне подсказку? Это будет высоко ценится!