; Evaluate your expression in your DSL
; ------------------------------
; The Little Lisper 3rd Edition
; Chapter 7
; Exercise 9
; Common Lisp
; http://t...content-available-to-author-only...r.com/thelittlelisper
; http://t...content-available-to-author-only...t.com/2010/06/little-lisper-chapter-7-shadows.html
; http://t...content-available-to-author-only...t.com/2010/06/little-lisper.html
; ------------------------------
(setf l1 '())
(setf l2 '(3 + (66 6)))
(setf aexp4 5)
; ------------------------------

(setf lexp1 '(AND (OR x y) y))
(setf lexp2 '(AND (NOT y)(OR u v)))
(setf lexp3 '(OR x y))
(setf lexp4 'z)

(defun lookup (a lat)
  (cond
   ((null a) NIL)
   ((null lat) NIL)
   ((eq a (car (car lat)))
    (cdr (car lat)))
   (t 
    (lookup a (cdr lat)))))
    
(defun operator (aexp_)
  (car aexp_))
  
(defun 1st-sub-expr (aexp_)
  (car (cdr aexp_)))

(defun 2nd-sub-expr (aexp_)
  (car (cdr (cdr aexp_))))

(defun Mlexp (lexp_ alist_)
  (cond
   ((null lexp_) NIL)
   ((null alist_) NIL)
   ((atom lexp_)
    (cond
     ;((eq lexp_ 't) t)
     ((= 1 (car(lookup lexp_ alist_))) t)
     (t NIL)))
   ((eq (operator lexp_) 'AND)
    (cond
    ((and
     (Mlexp (1st-sub-expr lexp_) alist_)
     (Mlexp (2nd-sub-expr lexp_) alist_))
     't)
     (t NIL)))
   ((eq (operator lexp_) 'OR)
    (cond
    ((or
     (Mlexp (1st-sub-expr lexp_) alist_)
     (Mlexp (2nd-sub-expr lexp_) alist_))
     't)
     (t NIL)))
    ((eq (operator lexp_) 'NOT)
     (cond
    ((not
     (Mlexp (1st-sub-expr lexp_) alist_))
      't)
     (t NIL)))
   (t NIL)))

(setf lexp1 '(AND (OR x y) y))

(print (Mlexp lexp1 '((x 1)(y 0)(z 0))))
;NIL false

(print (Mlexp lexp2 '((y 0)(u 0)(v 1))))
;T 

(print (Mlexp lexp4 '((x 1)(y 0)(z 0))))
; NIL false
