- 現在の非終端記号
- car, cdr, cons, quote, define, if, eq?, list?
- condをifに、代入演算(バインド)はset!を削ってdefine単体のみとする。condは引数の数を決定できないうえに、構文的束縛が強いのでランダムに木構造を作るのは難しい。atomにatomかlistをバインドする場合、最初はdefineでなければ不可能、set!はバインドの変更はできるが、新しいバインドを作れない。
(use math.mt-random)
(define mt (make <mersenne-twister> :seed (sys-time)))
(define (non-terminal)
(let ((rand (mt-random-integer mt 8) ))
(cond ((eq? rand 0) 'car)
((eq? rand 1) 'cdr)
((eq? rand 2) 'cons)
((eq? rand 3) 'quote)
((eq? rand 4) 'define)
((eq? rand 5) 'if)
((eq? rand 6) 'eq?)
(else 'list?)