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)

