summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno Cichon <ebrasca.ebrasca@openmailbox.org>2016-10-21 21:13:18 +0200
committerBruno Cichon <ebrasca.ebrasca@openmailbox.org>2016-10-21 21:13:18 +0200
commit38e61b9e9a701968cc096c58d75cb2954a7484eb (patch)
treed0659fcb870719b26280e7af3b0ca0ef2c49afed
parentc14d5f24617c0c4bde337ba163a33fb4276166a2 (diff)
Ugrade paremeters of rules.
-rw-r--r--examples/l-system-exemple.lisp2
-rw-r--r--src/l-system.lisp27
2 files changed, 14 insertions, 15 deletions
diff --git a/examples/l-system-exemple.lisp b/examples/l-system-exemple.lisp
index bb16ecc..5f999c1 100644
--- a/examples/l-system-exemple.lisp
+++ b/examples/l-system-exemple.lisp
@@ -1,6 +1,6 @@
(in-package #:l-system-examples)
-(-> f (x)
+(-> f ()
(f 1)
(j 1)
(f 1))
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