(defun parse (str)
	(cond ((or (atom str) (operator? (car str))) str)
	((null (rest str)) (infix str))
	(t (parse (parse1 str>

(defun parse1 (str) 
(cond ((null (rest str)) (list (parse str)))
	((gt-or-eq-prec (op1 str) (op2 str))
		(cons (infix str) (rest str)))
	(t (cons (opnd1 str) (cons (op1 str) (parse1 (cddr str>

(defun infix (opnd-op-opnd)
	(list (op1 opnd-op-opnd) (parse (opnd1 opnd-op-opnd))
				(parse (opnd2 opnd-op-opnd>

(defun rest (str) 
	(cdddr str>

(defun op1 (str)
	(cadr str>

(defun op2 (str)
	(cadddr str>

(defun opnd1 (str)
	(car str>

(defun opnd2 (str)
	(caddr str>
(defun gt-or-eq-prec (op1 op2)
(selectq op2
((+ -))
(e nil)
(* (memq op1 '(* e)))
(/ (memq op1 '(* e)))
(progn (prin1 'error--) (prin1 op1)
	(prin1 'or) (prin1 op2)
	(prin1 '"is not an operator")
	(terpri>

(defun operator? (op)
	(memq op '(+ - * / e>

(defun test () (prog (x) loop (setq x (read)) 
	(print x) (print (arith (parse x))) (go loop)>
