altos/lisp: Clean up OS integration bits, add defun
[fw/altos] / src / lisp / ao_lisp_const.lisp
1                                         ; basic list accessors
2
3
4 (setq cadr (lambda (l) (car (cdr l))))
5 (setq caddr (lambda (l) (car (cdr (cdr l)))))
6 (setq list (lexpr (l) l))
7
8                                         ; evaluate a list of sexprs
9
10 (setq progn (lexpr (l) (last l)))
11
12                                         ; simple math operators
13
14 (setq 1+ (lambda (x) (+ x 1)))
15 (setq 1- (lambda (x) (- x 1)))
16
17                                         ;
18                                         ; Define a variable without returning the value
19                                         ; Useful when defining functions to avoid
20                                         ; having lots of output generated
21                                         ;
22
23 (setq def (macro (def-param)
24                  (list
25                   'progn
26                   (list
27                    'set
28                    (list
29                     'quote
30                     (car def-param))
31                    (cadr def-param)
32                    )
33                   (list
34                    'quote
35                    (car def-param)
36                    )
37                   )
38                  )
39      )
40
41                                         ; define a set of local
42                                         ; variables and then evaluate
43                                         ; a list of sexprs
44                                         ;
45                                         ; (let (var-defines) sexprs)
46                                         ;
47                                         ; where var-defines are either
48                                         ;
49                                         ; (name value)
50                                         ;
51                                         ; or
52                                         ;
53                                         ; (name)
54                                         ;
55                                         ; e.g.
56                                         ;
57                                         ; (let ((x 1) (y)) (setq y (+ x 1)) y)
58
59 (def let (macro (let-param)
60                 ((lambda (vars exprs make-names make-exprs make-nils)
61                    (progn
62
63                                         ;
64                                         ; make the list of names in the let
65                                         ;
66
67                      (set 'make-names (lambda (vars)
68                                        (cond (vars
69                                               (cons (car (car vars))
70                                                     (make-names (cdr vars))))
71                                              )
72                                        )
73                           )
74                                         ;
75                                         ; the set of expressions is
76                                         ; the list of set expressions
77                                         ; pre-pended to the
78                                         ; expressions to evaluate
79                                         ;
80                      (set 'make-exprs (lambda (vars exprs)
81                                        (progn
82                                          (cond (vars (cons
83                                                       (list set
84                                                             (list quote
85                                                                   (car (car vars))
86                                                                   )
87                                                             (cadr (car vars))
88                                                             )
89                                                       (make-exprs (cdr vars) exprs)
90                                                       )
91                                                      )
92                                                (exprs)
93                                                )
94                                          )
95                                        )
96                           )
97                      (set 'exprs (make-exprs vars exprs))
98
99                                         ;
100                                         ; the parameters to the lambda is a list
101                                         ; of nils of the right length
102                                         ;
103                      (set 'make-nils (lambda (vars)
104                                       (cond (vars (cons nil (make-nils (cdr vars))))
105                                             )
106                                       )
107                           )
108                                         ;
109                                         ; build the lambda.
110                                         ;
111                      (set 'last-let-value 
112                      (cons
113                       (list
114                        'lambda
115                        (make-names vars)
116                        (cond ((cdr exprs) (cons 'progn exprs))
117                              ((car exprs))
118                              )
119                        )
120                       (make-nils vars)
121                       )
122                      )
123                      )
124                      
125                    )
126                  (car let-param)
127                  (cdr let-param)
128                  ()
129                  ()
130                  ()
131                  )
132                 )
133      )
134
135                                         ;
136                                         ; A slightly more convenient form
137                                         ; for defining lambdas.
138                                         ;
139                                         ; (defun <name> (<params>) s-exprs)
140                                         ;
141
142 (def defun (macro (defun-param)
143                     (let ((name (car defun-param))
144                           (args (cadr defun-param))
145                           (exprs (cdr (cdr defun-param))))
146                       (list
147                        def
148                        name
149                        (list
150                         'lambda
151                         args
152                         (cond ((cdr exprs)
153                                (cons progn exprs))
154                               ((car exprs))
155                               )
156                         )
157                        )
158                       )
159                     )
160      )