summaryrefslogtreecommitdiff
path: root/cond.lisp
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <matthias@benkard.de>2008-07-03 20:23:22 +0200
committerMatthias Andreas Benkard <matthias@benkard.de>2008-07-03 20:23:22 +0200
commit3b94099c717020be8c29588551f61bc67e610d9d (patch)
treef368e672ba3de6ec0f4d20f2c175d6039ca7e1f1 /cond.lisp
parentcfd165366900e6719fbb094c2a70eb8c8009a0dd (diff)
Implement COND, LET*, and LIST*.
Diffstat (limited to 'cond.lisp')
-rw-r--r--cond.lisp30
1 files changed, 30 insertions, 0 deletions
diff --git a/cond.lisp b/cond.lisp
new file mode 100644
index 0000000..e5aed02
--- /dev/null
+++ b/cond.lisp
@@ -0,0 +1,30 @@
+(%fset 'list*
+ (%lambda args
+ (if (null (cdr args))
+ (car args)
+ (cons (car args)
+ (apply 'list* (cdr args))))))
+
+(%defmacro let* args
+ (let ((form (car args)))
+ (let ((bindings (car (cdr form)))
+ (body (cdr (cdr form))))
+ (if (null bindings)
+ (list* 'let nil body)
+ (let ((first-binding (car bindings))
+ (rest (cdr bindings)))
+ (list 'let
+ (list first-binding)
+ (list* 'let* rest body)))))))
+
+(%defmacro cond args
+ (let* ((form (car args))
+ (clauses (cdr form))
+ (clause (car clauses))
+ (rest (cdr clauses)))
+ (if (null clauses)
+ nil
+ (list 'if
+ (car clause)
+ (cons 'progn (cdr clause))
+ (cons 'cond rest)))))