2012/08/08(水) [n年前の日記]
#2 [lisp][scheme] リストとベクトル
Script-fuコンソールで色々実験していたら、
検索してみてようやく分かった。Scheme には、リスト(list)とベクトル(vector)というものがあるのだな…。
ベクトルから順次値を取り出して処理する方法が分からなかったけど。以下のように書けるらしい。
順次 vector から値を取り出して処理ができるらしい、vector-for-each なるものもあるらしいけど。どうもR6RSなる規格?から追加された機能らしく。GIMP の TinyScheme や、DrRacket あたりでは、使えないっぽい。たぶんその2つは、R5RSとやらじゃないかしら。わからんけど。
リストから順次値を取り出して処理するのは、for-each が使えるらしい?
(7 #(2 3 4 5 6 7 8))みたいな結果が表示されて。この「#」は何だろう? と…。
検索してみてようやく分かった。Scheme には、リスト(list)とベクトル(vector)というものがあるのだな…。
- (0 1 2 3) はリスト。
- #(0 1 2 3) はベクトル。
- セルが繋がってできているものがリスト。
- 配列みたいなものがベクトル。
- car や cdr で取り出せるのがリスト。
- vector-ref で取り出せるのがベクトル。
- 個数を自由に変えられるのがリスト。
- 個数を変えられないのがベクトル。
ベクトルから順次値を取り出して処理する方法が分からなかったけど。以下のように書けるらしい。
(define (vec_loop vec) ;; 関数名、vector (let loop ((i 0)) ;; i を 0 で初期化 (cond ((< i (vector-length vec)) ;; vectorの個数よりiが小さい間は処理を繰り返す (let* ((v (vector-ref vec i))) ;; vector から1つ取り出して v に入れる (display "---") ;; ここではメッセージ表示だけしてる (display v) (newline)) (loop (+ i 1)))))) ;; iをインクリメントして、loop関数を繰り返す名前付きletとやらを使う、とかなんとか。loop と書いてあるけど、別に名前は何でもいいらしい。
順次 vector から値を取り出して処理ができるらしい、vector-for-each なるものもあるらしいけど。どうもR6RSなる規格?から追加された機能らしく。GIMP の TinyScheme や、DrRacket あたりでは、使えないっぽい。たぶんその2つは、R5RSとやらじゃないかしら。わからんけど。
リストから順次値を取り出して処理するのは、for-each が使えるらしい?
(for-each (lambda (x) (display x) (newline)) '(0 1 2 3))あるいは、関数を再帰的に呼ぶのかな。わからんけど。
◎ _1 :
DrRacket は、最初の1行目から以下を書いておけば、R6RS も使えるようになるらしい。上下のウインドウの、上のウインドウに、
#!r6rs (import (rnrs lists (6)) (rnrs base (6)) (rnrs io simple (6)))と打って実行(Ctrl+R)してみたら、下のウインドウで vector-for-each が使えるようになった。
[ ツッコむ ]
以上です。