diff options
author | Bruno Cichon <ebrasca.ebrasca@openmailbox.org> | 2016-10-21 21:13:18 +0200 |
---|---|---|
committer | Bruno Cichon <ebrasca.ebrasca@openmailbox.org> | 2016-10-21 21:13:18 +0200 |
commit | 38e61b9e9a701968cc096c58d75cb2954a7484eb (patch) | |
tree | d0659fcb870719b26280e7af3b0ca0ef2c49afed /src/l-system.lisp | |
parent | c14d5f24617c0c4bde337ba163a33fb4276166a2 (diff) |
Ugrade paremeters of rules.
Diffstat (limited to 'src/l-system.lisp')
-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 |