TUTScheme の利用 京都大学情報学研究科通信情報システム専攻湯淺研究室 D1 平石拓 2005/10/18 Scheme Scheme Lispの方言の一つ (cf. Common Lisp, Emacs Lisp) リスト処理 対話環境 デバッグがしやすい 小さい言語仕様 (50ページ). 高い拡張性. C(C99) は538ページ Common Lisp( 第 2 版 ) は1029ページ GC( ごみ集め ) 継続オブジェクト... TUTScheme Schemeの実装の1つ. 湯淺先生, 小宮先生 ( 豊橋技科大 ) 開発 利用手段 メディアセンターの端末 http://www.pro.ics.tut.ac.jp/~komiya/download/ から入手 Windows(Cygwin 版もあり ) Mac OS X RedHat Linux 1
起動 終了 $ tus TUTScheme version 1.4g (C) Copyright Taiichi Yuasa SC> (+ 3 4) 7 SC> (bye) Bye. $ 起動 終了処理系によっては (exit), (quit) 対話環境の利用 SC> (+ 3 4) 7 (+ 3 4) の評価値 SC> (* (+ 1 2) (- 10 7)) 9 (* (+ 1 2) (- 10 7)) の評価値 SC> 1234 1234 1234の評価値 SC> "abc" "abc" "abc" の評価値 変数定義 (1) SC> (define x 10) x SC> x 10 SC> (* x (+ x 3)) 130 SC> (set! x 24) 24 SC> x 24 x という名前の変数を定義 x (x+3) x の値を変更 2
変数定義 (2): 局所的な変数 SC> (let ((x 10) (y 20)) (* x (+ x y))) 300 SC> x Error: x is an unbound symbol.... 関数定義 (1) SC> (define (square x) (* x x)) square SC> (square 10) 100 SC> (square (* 3 4)) 144 関数定義 (2) n! を求める関数 SC> (define (fact n) (if (= n 0) 1 (* n (fact (- n 1))))) fact SC> (fact 10) 362800 n=0 の時 n=0 でない時 3
記号 (1) (quote 記号 ) スペシャル フォーム SC> (quote x) x SC> (quote cat) cat SC> (define x (quote y)) x SC> x y 記号 (2) 記号 でも同じ意味 SC> x x SC> cat cat SC> (define x y) x SC> x y リスト (1) Lispにおける最も重要なデータ型の1つ データ ( 要素 ) の 並び を表す (1 2 3 4 5 6 7 8 9 10) (we eat rice) ((a b c) x y (1 2)) など 4
リスト (2) SC> (list 1 2 3 4) (1 2 3 4) SC> (list w x (list y z)) (w x (y z)) SC> (define x 4) x SC> (list x (* x 5)) (4 20) SC> (list) () 空リスト リスト (3) リストの要素がわかっている場合は (quote 記号 ) でもよい SC> (x y) (quote (x y)) と同じ (x y) SC> ((x y) 1 2 (a b c)) ((x y) 1 2 (a b c)) SC> (define (square x) (* x x)) (define (square x) (* x x)) リストを扱う関数 (car, cdr) SC> (car (a b c d)) リストの先頭要素 a SC> (cdr (a b c d)) 先頭要素を除いたリスト (b c d) SC> (car (cdr (cdr (a b c d)))) c SC> (cdr (cdr (cdr (cdr (a b c d))))) () 5
リストを扱う関数 (cons) リストの先頭に要素を追加 SC> (cons we (eat rice)) (we eat rice) SC> (cons never (cdr (we eat rice))) (never eat rice) SC> (cons (a b c) (x y z)) ((a b c) x y z) SC> (cons single () ) (single) リスト処理関数の定義例 SC> (define (my-length x) (if (null? x) 0 (+ 1 (my-length (cdr x))))) my-length SC> (my-length (a b c d)) 4 式の評価 (+ (* 3 2) 5) や (define x 30) なども それ自身は単なるリスト SC> (list + (list * 3 2) 5) (+ (* 3 2) 5) システムがこのリストを 評価 すると 関数呼び出し式 として処理を行い 値を返す システムが評価できるデータを フォーム という フォームでないデータを評価しようとすると エラーになる 6
フォームの分類 (1) リスト フォーム 関数適用 ( 関数 式 1 式 n ) 1. 関数 と 式 1 ~ 式 n を評価 2. 関数を 式 1 ~ 式 n の評価結果に適用 スペシャル フォーム define, set!, quote, if など特定の記号で始まるリスト それぞれのスペシャルフォームごとに決まった評価方法 マクロ フォーム ( 関数適用とは違う ) マクロを表す記号で始まるリスト ( 詳細は省略 ) フォームの分類 (2) 記号 変数の値が評価値になる SC> (define x 30) x SC> x 30 SC> + #<function +> フォームの分類 (3) その他のデータ 数値や文字列などは それ自身が評価値となる SC> 123 123 SC> abcde abcde 7
cons セル (1) 例 1: (we eat rice) の内部表現 we eat rice () :cons セル car 部 cdr 部 cons セル (2) 例 2: (define x (we eat rice)) (define y (cons they (cdr x)) x: y: we eat rice () they cons セル (3) (cons データ 1 データ 2 ): car 部と cdr 部がそれぞれ データ 1, データ 2 であるコンス データを返す SC> (cons rice ()) (rice) SC> (cons eat (cons rice ())) (eat rice) SC> (cons we (cons eat (cons rice ()))) (we eat rice) 8
cons セル (4) ドット ペア SC> (cons x y) (x. y) ドット リスト x y SC> (cons x (cons y z)) (x y. z) x y z cons セル (5) 破壊的操作 SC> (set-cdr! x 123) (we. 123) SC> (set-car! x y) ((they eat rice). 123) x: we 123 eat rice () y: they 入出力関数 (1) 出力関数 SC> (write (a b c)) (a b c)(a b c) システムの出力 ( 評価値 ) write 関数の出力 SC> (begin (write (a b c)) (newline)) (a b c) write 関数の出力 #t システムの出力 ( 評価値 ) 9
入出力関数 (2) SC> (define (square x) (write (list x x)) (newline) (* x x)) square SC> (square (* 3 4)) (x 12) 144 入出力関数 (3) 入力関数 SC> (read) abcde ( キーボードから入力 ) abcde システムの出力 ( 評価値 ) SC> (begin (display input: ) (fact (read))) input: 11 ( キーボードから入力 ) 39916800 ( プロンプト ) ファイル入出力 (1) SC> (define out (open-output-file outfile )) out SC> out #<port to outfile> SC> (write (fact 7) out) (fact 7) の結果を outfile に書き込む 5040 SC> (newline out) #t SC> (close-output-port out) #t 10
ファイル入出力 (2) SC> (define in (open-input-file infile )) in SC> (read in) infile からデータを1つ読み込む data SC> (read in) #<end-of-file> ファイルの終端に達した場合 SC> (close-input-port in) #t ファイル入出力 (3) (call-with-output-file ファイル名 関数 ): 指定されたファイルへの出力ポートを引数として 関数 を呼び出し, その返り値を返す. (call-with-input-file ファイル名 関数 ): 指定されたファイルへの入力ポートを引数として 関数 を呼び出し, その返り値を返す. 関数 は 1 引数でなければならない 実行終了後 ファイルは自動的に閉じられる ファイル入出力 (4) 例 :1 2, 2 2,..., 99 2 の値をファイルに書き出す (call-with-output-file square99 (lambda (out) (do ((n 1 (+ 1 n))) ((>= n 100)) (write (* n n) out) (newline out)))) 11
ファイル入出力 (5) 例 : ファイルから全てのデータを順に読み込んで画面に表示する (call-with-input-file infile (lambda (in) (do ((dat (read in) (read in))) ((eof-object? dat)) (write dat) (newline)))) プログラム ファイル (load ファイル名 ): ファイルに書かれているフォームを順に 全て評価する SC> (load square.scm ) Loading square.scm... Finished. square.scm SC> (square 4) 16 関数実行のトレース (trace 関数名 ): 関数のトレースを開始 (untrace 関数名 ): トレースをやめる 標準ではないが, たいていの処理系で使える. 12
関数実行のトレース ( 使用例 ) SC> (trace fact) #t SC> (fact 2) 1>(fact 2) 2>(fact 1) 3>(fact 0) 3<(fact 1) 2<(fact 1) 1<(fact 2) 2 代表的な組み込み関数 ( 数値 ) 加減乗除 (+ 数値 1 数値 n ) (- 数値 1 数値 n ) (* 数値 1 数値 n ) (/ 数値 1 数値 n ) (remainder 整数 1 整数 2 ) : 割り算の余り (cf. modulo) 比較 (= 数値 1 数値 n ) (< 数値 1 数値 n ) (> 数値 1 数値 n ) (<= 数値 1 数値 n ) (>= 数値 1 数値 n ) 代表的な組み込み関数 ( リスト ) (length リスト ) (append リスト 1 リスト n ) (reverse リスト ) 13
代表的な組み込み関数 ( 等号 論理演算 ) 等号 (eq? データ1 データ2 ) (eqv? データ1 データ2 ) (equal? データ 1 データ 2 ) 論理演算 (not データ 1 ) (and データ1 データn ) 特殊フォーム (or データ1 データn ) 特殊フォーム 代表的な組み込み関数 ( データ型述語 ) (number? データ ) (integer? データ ) (symbol? データ ) (pair? データ ) (list? データ ) (null? データ ) (string? データ ) その他の組み込み関数 ヘルプ機能 (tus, guileなど ) (apropos 文字列 ): 文字列 を含む組み込み関数 スペシャルフォーム マクロの一覧を表示する. 14
レポートについて ソースコードは手書き厳禁! 適当なところで改行. インデント (emacs 推奨 ). コメント ( ; を使う ) もできるだけつけること. (define (square x) (write (list x x)) (newline) (* x x)) レポートについて ソースコードは手書き厳禁! 適当なところで改行. インデント (emacs 推奨 ). コメント ( ; を使う ) もできるだけつけること. (define (square x) (write (list x x)) ; 追加 (newline) ; 追加 (* x x)) ( 参考 ) TUTSchemeのマニュアル 今回扱わなかった関数等の説明 http://www.yuasa.kuis.kyoto-u.ac.jp/~komiya/tus-man/tus/ http://winnie.kuis.kyoto-u.ac.jp/~okuno/lecture/05/introalgds/ 15