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))