diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/l-system.lisp | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/src/l-system.lisp b/src/l-system.lisp index d1f782f..591f43f 100644 --- a/src/l-system.lisp +++ b/src/l-system.lisp @@ -14,28 +14,27 @@ (finally (return result)))) (defun map-l-system (clauses) - (iter (for clause in clauses) - (appending (let ((func (gethash (car clause) *l-system-clauses*))) - (if (functionp func) - (let ((result (apply func - (rest clause)))) - (when result - result)) - (list clause)))))) - -(defun setf-l-system-rule (symbol lambda) - (setf (gethash symbol *l-system-clauses*) - lambda)) + (iter (for (symbol . parameters) in clauses) + (for func = (gethash symbol *l-system-clauses*)) + (appending (if (functionp func) + (apply func parameters) + parameters)))) + +(defmacro setf-l-system-rule (symbol lambda) + `(setf (gethash ,symbol *l-system-clauses*) + ,lambda)) (defun make-l-system-expr (item) - `(list ',(first item) ,(second item))) + `(list ',(first item) ,@(rest item))) (defun make-l-system-list (rest) (iter (for item in rest) (collecting (make-l-system-expr item)))) (defmacro make-l-system-rule (vars &body body) - `#'(lambda ,vars (list ,@(make-l-system-list body)))) + `#'(lambda ,(append vars '(&rest rest)) + (declare (ignorable rest)) + (list ,@(make-l-system-list body)))) (defmacro -> (symbol vars &body body) `(setf-l-system-rule ',symbol |