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.lisp9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/l-system.lisp b/src/l-system.lisp
index c3f47d0..1ea07fe 100644
--- a/src/l-system.lisp
+++ b/src/l-system.lisp
@@ -7,6 +7,8 @@
(defparameter *l-system-clauses* (make-hash-table :test 'equal))
(defun l-system (fn axiom depth)
+ "Expand axiom into some larger list of symbols.
+It can expand to parametric grammar or to context sensitive grammar."
(iter (repeat depth)
(with result = axiom)
(setf result
@@ -14,6 +16,7 @@
(finally (return result))))
(defun parametric-grammar (elements)
+ "Handle parametric grammar."
(iter (for (symbol . parameters) in elements)
(for func = (gethash symbol *l-system-clauses*))
(appending (if (functionp func)
@@ -21,6 +24,7 @@
(list `(,symbol ,@parameters))))))
(defun context-sensitive-grammar (elements)
+ "Handle context sensitive grammar and parametric grammar."
(iter (for elt on elements)
(with symbol0 = nil)
(for (symbol1 . parameters1) = (first elt))
@@ -33,21 +37,26 @@
(setf symbol0 (first (first elt)))))
(defmacro setf-l-system-rule (symbol lambda)
+ "Set rules to grammar."
`(setf (gethash ,symbol *l-system-clauses*)
,lambda))
(defun make-l-system-expr (item)
+ "(Symbol . paremetes)"
`(list ',(first item) ,@(rest item)))
(defun make-l-system-list (rest)
+ "Make rule conversion part."
(iter (for item in rest)
(collecting (make-l-system-expr item))))
(defmacro make-l-system-rule (vars &body body)
+ "Define rule for grammar."
`#'(lambda ,(append vars '(&rest rest))
(declare (ignorable rest))
(list ,@(make-l-system-list body))))
(defmacro -> (symbol vars &body body)
+ "Define and set rules to grammar."
`(setf-l-system-rule ',symbol
(make-l-system-rule ,vars ,@body)))