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ď č. 1Trik 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:
- Na
eval
funkcia by mala byť schopná spracovať surové čísla, nielen zoznamy obsahujúce operátorov. - 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.