summaryrefslogtreecommitdiff
path: root/src/l-system.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'src/l-system.lisp')
-rw-r--r--src/l-system.lisp27
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