summaryrefslogtreecommitdiff
path: root/src/lisp/ao_lisp_const.lisp
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2016-11-09 09:14:50 -0800
committerKeith Packard <keithp@keithp.com>2016-11-17 22:18:39 -0800
commit71796f4407ebf11251c150dfa368f571ba12db8d (patch)
tree9bdc0d22c719a5745cf8e9632c4f1dd4b316c5d0 /src/lisp/ao_lisp_const.lisp
parent9e58eeb68a293ae94e0672a31a2116fc52c9dd1e (diff)
altos/lisp: working on lexical scoping
Not working yet Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/lisp/ao_lisp_const.lisp')
-rw-r--r--src/lisp/ao_lisp_const.lisp136
1 files changed, 129 insertions, 7 deletions
diff --git a/src/lisp/ao_lisp_const.lisp b/src/lisp/ao_lisp_const.lisp
index 5ca89bd4..621fefc4 100644
--- a/src/lisp/ao_lisp_const.lisp
+++ b/src/lisp/ao_lisp_const.lisp
@@ -1,7 +1,129 @@
-cadr (lambda (l) (car (cdr l)))
-caddr (lambda (l) (car (cdr (cdr l))))
-list (lexpr (l) l)
-1+ (lambda (x) (+ x 1))
-1- (lambda (x) (- x 1))
-last (lambda (x) (cond ((cdr x) (last (cdr x))) ((car x))))
-prog* (lexpr (l) (last l))
+ ; basic list accessors
+
+
+(setq cadr (lambda (l) (car (cdr l))))
+(setq caddr (lambda (l) (car (cdr (cdr l)))))
+(setq list (lexpr (l) l))
+
+ ; evaluate a list of sexprs
+
+(setq progn (lexpr (l) (last l)))
+
+ ; simple math operators
+
+(setq 1+ (lambda (x) (+ x 1)))
+(setq 1- (lambda (x) (- x 1)))
+
+ ; define a variable without returning the value
+
+(set 'def (macro (def-param)
+ (list
+ 'progn
+ (list
+ 'set
+ (list
+ 'quote
+ (car def-param))
+ (cadr def-param)
+ )
+ (list
+ 'quote
+ (car def-param)
+ )
+ )
+ )
+ )
+
+ ; define a set of local
+ ; variables and then evaluate
+ ; a list of sexprs
+ ;
+ ; (let (var-defines) sexprs)
+ ;
+ ; where var-defines are either
+ ;
+ ; (name value)
+ ;
+ ; or
+ ;
+ ; (name)
+ ;
+ ; e.g.
+ ;
+ ; (let ((x 1) (y)) (setq y (+ x 1)) y)
+
+(def let (macro (let-param)
+ ((lambda (vars exprs make-names make-exprs make-nils)
+ (progn
+
+ ;
+ ; make the list of names in the let
+ ;
+
+ (set 'make-names (lambda (vars)
+ (cond (vars
+ (cons (car (car vars))
+ (make-names (cdr vars))))
+ )
+ )
+ )
+ ;
+ ; the set of expressions is
+ ; the list of set expressions
+ ; pre-pended to the
+ ; expressions to evaluate
+ ;
+ (set 'make-exprs (lambda (vars exprs)
+ (progn
+ (cond (vars (cons
+ (list set
+ (list quote
+ (car (car vars))
+ )
+ (cadr (car vars))
+ )
+ (make-exprs (cdr vars) exprs)
+ )
+ )
+ (exprs)
+ )
+ )
+ )
+ )
+ (set 'exprs (make-exprs vars exprs))
+
+ ;
+ ; the parameters to the lambda is a list
+ ; of nils of the right length
+ ;
+ (set 'make-nils (lambda (vars)
+ (cond (vars (cons nil (make-nils (cdr vars))))
+ )
+ )
+ )
+ ;
+ ; build the lambda.
+ ;
+ (set 'last-let-value
+ (cons
+ (list
+ 'lambda
+ (make-names vars)
+ (cond ((cdr exprs) (cons 'progn exprs))
+ ((car exprs))
+ )
+ )
+ (make-nils vars)
+ )
+ )
+ )
+
+ )
+ (car let-param)
+ (cdr let-param)
+ ()
+ ()
+ ()
+ )
+ )
+ )