初期集団の木構造の生成(Initialization)を考慮した、非終端記号をランダムに出力するコード

  • 現在の非終端記号
    • car, cdr, cons, quote, define, if, eq?, list?
      • condをifに、代入演算(バインド)はset!を削ってdefine単体のみとする。condは引数の数を決定できないうえに、構文的束縛が強いのでランダムに木構造を作るのは難しい。atomatomか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?)