scheme

空リストの表現

> (define empty '()) empty> (display empty) () >

手続きlast-pairの実装

与えられた(空でない)リストの最後の要素だけからなるリストを返す手続きを定義する定義例 (define (last-pair items) (if (= (length items) 2) (cdr items) (last-pair (cdr items)) )) 実行例 > (define a (list 23 72 139 32 88)) a> (display a) (23 7…

リストのn番目の要素を返す手続きlist-refの実装

cdrダウンすることで実現できる (define (list-ref items n) (if (= n 0) (car items) (list-ref (cdr items) (- n 1)) ) )

lengthの別の実装

ちょっと回りくどい (define (length items) (define (length-iter a count) (if (null? a) count (length-iter (cdr a) (+ 1 count)))) (length-iter items 0))

リストの個数を返す手続きlengthの実装

リストをcdrダウンしてカウントする。直感的にわかりづらいが慣れるしかない。 (define (length items) (if (null? items) 0 (+ 1 (length (cdr items))) ) ) 実行例 > (define odds (list 1 3 5 7)) > (length odds) 4

リストの中身を表示する

forループの代わりに再帰で書くのがScheme。なかなか慣れない。 (define (show items) (if (not (null? items)) (begin (display (car items)) (show (cdr items)) ) ) ) 実行結果 > (display exp-list) (item:1 item:2)> (show exp-list) item:1item:2#f

ファイルへの書出し

数字をファイルに書き出す場合の例 > (define port (open-output-file "test.output")) port> (display port) #[port 0x1174bee0] > (define num 10) num > (write num port) ()> (close-output-port port) #f > 唯一の解説ページ:Scheme 入門 9. 入出力

繰り返し処理の実装

>(for-each (lambda (x) (newline) (display x)) (list 1 2 3 4 5) )1 2 3 4 5 > 上の例のように5つくらいならリストを作れるが、数が増えるとたいへんになる。任意の数に拡張したい。他の書き方はないか?例えば下のように書く。 > (define (func n) (if (>…

リスト

(list-ref リスト 番号n):リストのn番目のものを返す (length リスト):リストの長さを返す 実行例 > (define odds (list 1 3 5 7)) odds> (display odds) (1 3 5 7) > (list-ref odds 0) 1> (length odds) 4

begin式

2つ以上の式をまとめて1つの式にするにはbegin式が使える。 if文の中で使えば、複数の処理ができるようになる。

mapとfor-eachの挙動の違い

mapは引数として手続きとリストをとり、その手続きをリストの各要素に作用させてできた結果のリストを返す。 mapの実行例。 > (map (lambda (x) (* x x)) (list 1 2 3 4) ) (1 4 9 16) > for-eachもmapと同じで、引数として手続きとリストをとる。しかし、結…

クォート

リストや記号を評価される式としてではなく、データオブジェクトとして扱いたときには引用符(')をクォートするオブジェクトの前に置く。使用例 > (define a 1) a > (define b 2) b > (list a b) (1 2) > (list 'a 'b) (a b) > (list 'a b) (a 2) >

doループの書き方

(do ((i 1 (+ i 1))) ((= i 7)) ...(繰り返したい処理) ) 無駄な括弧がある?

schemeに慣れる

局所変数x、yを定義する。そのためのlet。 定義した局所変数の値を変更する。そのためのset!。使用例は以下の通り。 (define (example) (let ((x 0) (y 0)) ... (set! x (+ x amount)) (set! y (+ y amount)) ...

円周率の定義

(define pi (* 2 (asin 1)))

今日のscheme

(string-length c) : 文字列cの長さを返す > (define cc "test") cc > (string-length cc) 4 (symbol->string a) : シンボルを文字列に変換する

ファイルの削除

> (remove "*.jpg")

二重のIF文

> (if (string=? aa "AA") (if (string=? bb "BB") (display cc) ) ) >

2つのdisplayを同時に実行する

if文で使える。 > (define aa "Hello") > (define bb " World!") > > (define (test) (display aa)(display bb) ) test > (test) Hello World! >

今日のscheme

let : 局所変数を定義 set! : 代入 map : リストに対して手続きを作用させた結果を返す cdr : 対の右側を取り出す memq : 記号がリストに含まれていないなら#f car : 対の左側を取り出す

今日のscheme

ファイル存在確認 (file-exist? "AAA") ---"AAA"というファイルが存在するか? #tか#fを返す。 文字列が含まれているか (substring? "aa" some-string) --- 文字列some-stringの中に"aa"が含まれているか? #tか#fを返す。 否定 (not #t) --- #fを返す。 (no…

今日のscheme

schemeに慣れなければ、いつまでも読めない。 define : 変数の定義。変数に値を関連付ける 例) > (define file-number 10) file-number > (display file-number) 10 string-append : 文字列の結合 例) > (define hoge1 "123") hoge1 > (define hoge2 "456"…