Jedným z možných riešení je napísať funkciu transformujúcu zápis v infixe na zápis v prefixe a potom tento zápis vyhodnotiť v hlavnej funkcii pomocou FUNCALL. Aby sme tento zápis pomocou FUNCALL mohli vyhodnotiť treba z neho ešte urobiť funkciu pomocou LAMBDA zápisu.


; Funkcia prefix transformuje zoznam v infixe na prefix.
; Predpokladá sa korektný vstup v infixe.
(defun prefix (zoz)
 (cond ((ATOM zoz) zoz)
       (T (cons (second zoz) (list (prefix (first zoz)) (prefix (third zoz)))))
 )
)

; Príklad:
(prefix '(2 + (3 * 4))) ; -> (+ 2 (* 3 4))

; Vyhodnot vezme zoznam (má mať formát prefixu), pridá do neho
; definíciu funkcie lambda a zavolá na takto zostavenú funkciu
; (ktorá je bez parametrov) FUNCALL.
; Napríklad ak zoz='(+ 1 2) -> FUNCALL sa zavolá na '(LAMBDA () (+ 1 2)).

(defun vyhodnot (zoz)
 (FUNCALL (cons 'LAMBDA (list NIL zoz)))
)

; Hlavná funkcia.
(defun ARIT (zoz)
 (vyhodnot (prefix zoz))
)

; Príklady:
(ARIT '(2 + (3 * 4)))       ; -> 14
(ARIT '((2 * 5) + (2 - 1))) ; -> 11

; Zaujímavosťou tohto riešenia je, že možno volať aj vlastné funkcie.
; Napríklad.

(defun my (a b)
 (list a b)
)

; Príklady:
(ARIT '(1 my 2))          ; -> (1 2)
(ARIT '("a" my (1 my 2))) ; -> ("a" (1 2))

Autori[ ZADANIE | AKO ZAČAŤ | RIEŠENIE ]
Posledná aktualizácia 4. 9. 2001
back  home  next