Circular List / Lisp(Scheme)

循環リストというリストがループしているデータに、リストを挿入をするテストをしてみました。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言語は向いていると感じました。

実行結果
circular01

About

Categories: 未分類 タグ: