Posted on 2015/04/27, 10:37 PM By admin22
循環リストというリストがループしているデータに、リストを挿入をするテストをしてみました。Schemeを使うと、簡単に循環リストを表現でき、それを通常のリストとして扱えます。
環境 : guile 2.0.9 / Ubuntu 14.04
circular.scm
#!/usr/bin/guile -s !# (use-modules (srfi srfi-1)) (define (lv ls n) (begin (display (car ls)) (display " ") (if (= n 1) -1 (lv (cdr ls) (- n 1))))) (define (circular! ls) (let loop ((ls1 ls) (ls2 ls)) (if (null? ls1) (set-cdr! ls2 ls) (loop (cdr ls1) ls1)))) (define (insert! ls ls1 nn) (let loop ((ls ls)(n 0)) (if (= (- nn 1) n) (let ((a (append ls1 (cdr ls)))) (set-cdr! ls '()) (append! ls a)) (loop (cdr ls)(+ n 1))))) (define nl '(1 2 3 4 5)) (circular! nl) (display (lv nl 20)) (newline) (insert! nl '(a b) 3) (display (lv nl 20)) (newline)
lvは、無限リストをあつかうため指定した数分だけ表示するというListView機能を用意しました。circlular!はリストをリング状にして循環させるもので、終端のセルのCDR部を先頭セルに書き換えます。
inser!は、指定位置に任意リストを挿入します。!は破壊的変更を意味します。
以前とりあげた順列を利用した総音程音列といい、このようなある法則にしたがったデータを作成するとき、やはりLisp言語は向いていると感じました。
Categories: 未分類 タグ: Lisp(Scheme)