OpenMusic:使用lisp生成L-System树

时间:2016-04-21 01:17:07

标签: tree lisp common-lisp l-systems

我正在尝试使用名为OpenMusic的组合工具,这是一个基于常见的lisp的图形开发环境,它使用了一种叫做“节奏树”的东西。我正在尝试使用一组规则创建节奏树,并且在OM中,此树必须具有以下结构:

  • 树是包含两个元素的列表
  • 它的第一个元素是节点
  • 它的第二个元素是它的子元素列表(也可以是树)

给定树深n,初始单节点树(1)和转换规则:

  • (1) - > (1 2)
  • (2) - > (1)

它应该给:

n = 1 - > (1(1 2))

1 个答案:

答案 0 :(得分:1)

树/列表的递归算法通常使用COND编写。你弄清楚结局条件是什么,并把它们放在第一位。然后处理原子,最后通过递归调用其CARCDR上的函数以及CONS结果来迭代列表,以生成输出列表。所以基本模板就像:

(defun algo (list)
  (cond
    ((end-condition) suitable-end-value)
    ((atom list) (do-something-with-atom list))
    (t (cons (algo (car list)
             (algo (cdr list))))))

在这种情况下,这将是:

(defun rhythm-tree (n tree)
  (cond ((zerop n) tree)                 ; First end-condition.
        ((null tree) '())                ; Another end-condition.
        ((atom tree)                     ; An atom: transform into...
         (cons tree                      ; a list of the atom itself...
               (list (rhythm-tree (1- n) ; and a list of children.
                                  (case tree
                                    (1 (list 1 2))
                                    (2 (list 1))
                                    (otherwise '()))))))
        ;; Iterate over elements of a list.
        (t (cons (rhythm-tree n (car tree))
                 (rhythm-tree n (cdr tree))))))

(rhythm-tree 1 1)
;=> (1 (1 2))
(rhythm-tree 2 1)
;=> (1 ((1 (1 2)) (2 (1))))