1 665c255d 2023-08-04 jrmu (defun make-sum (a1 a2)
2 665c255d 2023-08-04 jrmu (list a1 '+ a2))
3 665c255d 2023-08-04 jrmu (defun make-product (m1 m2)
4 665c255d 2023-08-04 jrmu (list m1 '* m2))
5 665c255d 2023-08-04 jrmu (defun sum? (x)
6 665c255d 2023-08-04 jrmu (and (consp x) (eql (cadr x) '+)))
7 665c255d 2023-08-04 jrmu (defun addend (x)
9 665c255d 2023-08-04 jrmu (defun augend (s)
11 665c255d 2023-08-04 jrmu (defun product? (x)
12 665c255d 2023-08-04 jrmu (and (consp x) (eql (cadr x) '*)))
13 665c255d 2023-08-04 jrmu (defun multiplier (s)
15 665c255d 2023-08-04 jrmu (defun multiplicand (s)
18 665c255d 2023-08-04 jrmu (defvar *stream* '() "Token stream")
19 665c255d 2023-08-04 jrmu (defun init-stream (stream)
20 665c255d 2023-08-04 jrmu "Initialize the stream"
21 665c255d 2023-08-04 jrmu (setq *stream* stream))
22 665c255d 2023-08-04 jrmu (defun next-token ()
23 665c255d 2023-08-04 jrmu "Returns the next token of the stream"
24 665c255d 2023-08-04 jrmu (car *stream*))
25 665c255d 2023-08-04 jrmu (defun scan ()
26 665c255d 2023-08-04 jrmu (pop *stream*))
27 665c255d 2023-08-04 jrmu (defvar *stream-stack* '() "Stack of streams")
28 665c255d 2023-08-04 jrmu (defun push-stream (stream)
29 665c255d 2023-08-04 jrmu "Push the current *stream* on stack, and set this tream as *stream*"
30 665c255d 2023-08-04 jrmu (push *stream* *stream-stack*)
31 665c255d 2023-08-04 jrmu (init-stream stream))
32 665c255d 2023-08-04 jrmu (defun pop-stream ()
33 665c255d 2023-08-04 jrmu (init-stream (pop *stream-stack)))
34 665c255d 2023-08-04 jrmu (defun parse-factor ()
35 665c255d 2023-08-04 jrmu (let ((tok (next-token)))
37 665c255d 2023-08-04 jrmu ((or (numberp tok) (sybolp tok))
40 665c255d 2023-08-04 jrmu ((listp tok)
41 665c255d 2023-08-04 jrmu (push-strea tok)
42 665c255d 2023-08-04 jrmu (let ((sum (parse-sum)))
43 665c255d 2023-08-04 jrmu (pop-stream)
46 665c255d 2023-08-04 jrmu (t (error "Bad token in parse-atom -- ~A" tok)))))
47 665c255d 2023-08-04 jrmu (defun parse-term ()
48 665c255d 2023-08-04 jrmu (let ((lfact (parse-factor)))
49 665c255d 2023-08-04 jrmu (if (eq (next-token) '*)
52 665c255d 2023-08-04 jrmu (let ((rterm (parse-term)))
53 665c255d 2023-08-04 jrmu (list '* lfact rterm)))
55 665c255d 2023-08-04 jrmu (defun (parse-