mieki256's diary



2012/08/08(水) [n年前の日記]

#2 [lisp][scheme] リストとベクトル

Script-fuコンソールで色々実験していたら、
(7 #(2 3 4 5 6 7 8))
みたいな結果が表示されて。この「#」は何だろう? と…。

検索してみてようやく分かった。Scheme には、リスト(list)とベクトル(vector)というものがあるのだな…。
ベクトルから順次値を取り出して処理する方法が分からなかったけど。以下のように書けるらしい。
(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 が使えるようになった。

以上です。

過去ログ表示

Prev - 2012/08 - Next
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project