/ / raketa: implementačná funkcia (eval t) - zoznam, schéma, eval, raketa

raketa: implementovať funkciu (eval t) - zoznam, schéma, eval, raketu

Snažím sa implementovať funkciu (eval t), ktorá robí nasledovné:

príklady:

(eval "(2 * (1 + 2))) -> 6

(eval "((3 - (4 / 2)) * 2) -> 2

To, čo mám, je:

(define (inner lst)
((cond
((equal? (second lst) "+) +)
((equal? (second lst) "-) -)
((equal? (second lst) "*) *)
((equal? (second lst) "/) /))
(first lst) (third lst)))


(define (eval t)
(cond
((and (number? (first t)) (number? (third t))) (inner t))
((list? (third t)) (eval `(,(first t) ,(second t) ,(inner (third t)))))
((list? (first t)) (eval `(,(inner (first t)) ,(second t) ,(third t))))))

Funguje pre:

(eval "(1 + (1 + 2))) -> 4

(eval "((1 + 1) + (2 + 2))) -> 6

ale to neplatí pre prípady ako:

(eval "((1 + 1) + (1 + (1 + 1))))

Každá pomoc bude veľmi ocenená!

odpovede:

4 pre odpoveď č. 1

Trik je tu pochopiť tieto výrazymôžu mať presne dve formy: surový číselný údaj alebo zoznam obsahujúci operáciu. Ako pseudo-gramatika to znamená, že každý výraz musí zodpovedať nasledujúcej štruktúre:

vyjadrenie = číslo | ( vyjadrenie prevádzkovateľ vyjadrenie )

prevádzkovateľ   = + | - | * | /

To znamená, že eval funkcia musí byť schopná zvládnuť buď výraz, takže všetky by mali fungovať:

(eval 7)             ; => 7
(eval "(1 + 6))      ; => 7
(eval "((2 * 3) + 1) ; => 7

Z toho môžete vziať dve veci:

  1. Na eval funkcia by mala byť schopná spracovať surové čísla, nielen zoznamy obsahujúce operátorov.
  2. Existujú len dva prípady, ktoré by sa mali riešiť v eval Funkcie.

To znamená, že eval by mal pravdepodobne trvať takýto formulár:

; eval : expression? -> number?
(define (eval expr)
(cond
[(number? x) ???]
[else        ???]))

Vaše mnoho rôznych prípadov pre vašu implementáciu eval sú príliš zložité a zbytočné. Nemali by ste kontrolovať štruktúru zoznamu, pretože vždy treba presne vyhodnotiť: eval na ľavej strane eval na pravej strane, potom kombinujte obe strany spolu s operáciou v strede. Toto funguje, pretože ak eval dokáže zvládnuť čísla, potom niečo podobné (eval 3) bude fungovať správne.

Znie to ako problém s domácimi úlohami, takže nebudem vzdávať precíznej implementácie, ale dúfam, že by to malo stačiť na to, aby vás nasmerovalo správnym smerom.