From 3b94099c717020be8c29588551f61bc67e610d9d Mon Sep 17 00:00:00 2001 From: Matthias Andreas Benkard Date: Thu, 3 Jul 2008 20:23:22 +0200 Subject: Implement COND, LET*, and LIST*. --- cond.lisp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 cond.lisp (limited to 'cond.lisp') 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))))) -- cgit v1.2.3