学術情報メディアセンター メディアコンピューティング分野 助教 平石 拓

Slides:



Advertisements
Similar presentations
1 情報基礎 A 第 9 週 プログラミング入門 VBA の基本文法 1 準備・変数・データの入出力 徳山 豪・全 眞嬉 東北大学情報科学研究科 システム情報科学専攻 情報システム評価学分野.
Advertisements

2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
プログラミング言語論 第8回 LISP 担当:犬塚.
プログラミング言語論 関数型プログラミング言語 水野嘉明
Fortran と有限差分法の 入門の入門の…
東京工科大学 コンピュータサイエンス学部 亀田弘之
京都大学情報学研究科 通信情報システム専攻 湯淺研究室 M2 平石 拓
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
ISD実習E 2009年6月29日 LISPシステム入門 (第5回) 関数ポインタ eval システム関数.
プログラミング言語としてのR 情報知能学科 白井 英俊.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
ISD実習E 2009年7月13日 LISPシステム入門 (第6回) 関数の定義 eval load 関数.
ファーストイヤー・セミナーⅡ 第8回 データの入力.
Debianにおける Common Lispプログラミング環境
6/19 前回復習 for文による繰り返し計算 演習1:1から10まで足して画面に結果を表示する 提出者: 1人
「R入門」 第1章: 紹介と準備 (思い切って簡単に) 第2章: 簡単な操作 10月10日(金) 発表者 新納浩幸.
数値計算及び実習 第3回 プログラミングの基礎(1).
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
ISD実習E 2009年6月1日 read関数 read-macro back-quote 文字列のread 課題
第13回 プログラミングⅡ 第13回
数値計算及び実習 第7回 プログラミングの基礎(5).
条件式 (Conditional Expressions)
Tokuda Lab. NISHIMURA Taichi
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
スクリプト言語を用いたPHITSの連続実行
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
プログラミング言語入門 手続き型言語としてのJava
プログラミング 2 ファイル処理.
PROGRAMMING IN HASKELL
プログラミング言語論 第9回 Hoare論理の練習問題 手続きの引数機構 変数の有効範囲
第10回関数 Ⅱ (ローカル変数とスコープ).
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
京都大学情報学研究科 通信情報システム専攻 湯淺研究室 D1 平石 拓 2005/10/18
第7回 プログラミングⅡ 第7回
4.リスト,シンボル,文字列.
プログラミング言語論 第5回 手続きの引数機構 変数の有効範囲
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
コンパイラ 2011年10月20日
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
C言語 はじめに 2016年 吉田研究室.
情報とコンピュータ 静岡大学工学部 安藤和敏
15.cons と種々のデータ構造.
統計ソフトウエアRの基礎.
プログラミング演習I 2003年7月2日(第11回) 木村巌.
情報基礎Ⅱ (第1回) 月曜4限 担当:北川 晃.
PROGRAMMING IN HASKELL
執筆者:難波和明 授業者:寺尾 敦 atsushi [at] si.aoyama.ac.jp
情報処理Ⅱ 2006年11月24日(金).
情報処理Ⅱ 第7回 2004年11月16日(火).
PROGRAMMING IN HASKELL
高度プログラミング演習 (11).
標準入出力、変数、演算子、エスケープシーケンス
プログラミング基礎a 第3回 C言語によるプログラミング入門 データ入力
コンパイラ 2012年10月11日
PROGRAMMING IN HASKELL
関数と再帰 教科書13章 電子1(木曜クラス) 2005/06/22(Thu.).
プログラミング演習I 2003年6月11日(第9回) 木村巌.
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
第10回 関数と再帰.
情報処理Ⅱ 小テスト 2005年2月1日(火).
プログラミング基礎a 第3回 C言語によるプログラミング入門 データ入力
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
printf・scanf・変数・四則演算
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
プログラミング言語論 プログラミング言語論 演習7 解答と解説 演習7 解答と解説 1.
Presentation transcript:

学術情報メディアセンター メディアコンピューティング分野 助教 平石 拓 (TUT-)Scheme入門 学術情報メディアセンター メディアコンピューティング分野 助教 平石 拓

今日話す内容 Lisp (Scheme)の基本を一通り解説 SICPの1.1~1.1.6 1.1.6までに載ってないけど知っておいたほうがいいこと リスト (lists) 局所変数 (local variables: let) コンス・セル (cons cells) ファイル入出力 (file I/O) トレース (tracing)

Lisp言語 John McCarthy によって発明(1958年) FORTRAN(1957年)に次いで2番目に古い 特徴 リスト処理が得意(List Processor) 対話環境 動的型付け,closureオブジェクト,... 「やりたいこと」だけに集中してプログラムが書ける rapid prototyping LispのプログラムをLisp自身で扱うことができる 書きたいプログラムに合わせて言語自体をカスタマイズ可能

Lispの方言 Common Lisp Scheme Emacs Lisp AutoLisp … Lisp1.5 MACLISP ISLisp …

Scheme Lispの方言の一つ プログラミング言語として本当に必要な部分だけを できるだけコンパクトにまとめた仕様 継続オブジェクト 言語仕様(R5RS) は50ページ (2007/09に成立した新仕様(R6RS)で3倍以上に増え,一部反発) C(C99)は538ページ Common Lisp(第2版)は1029ページ 継続オブジェクト 実行中の処理の「残りの計算」をプログラムで扱える 真の末尾再帰呼び出しをサポート 繰り返し構文(Cでいうwhileなど)を持たない

Scheme処理系の入手 TUT-Scheme JAKLD (JAva Kumikomi-you Lisp Driver) 湯淺先生,小宮先生(元湯淺研)開発 利用手段 メディアセンターの端末 (Linux) http://www.spa.is.uec.ac.jp/~komiya/download/ から入手 Windows(Cygwin版もあり),Mac OS X,Linux JAKLD (JAva Kumikomi-you Lisp Driver) 湯淺先生開発 http://ryujin.kuis.kyoto-u.ac.jp/~yuasa/jakld/index-j.html JVMが動く環境ならどこでも動く iアプリ(DoCoMo)版もある! MIT Scheme

起動・終了 起動 終了 % java jakld.Eval JAKLD for SICP (October 10, 2008) (c) Copyright Taiichi Yuasa, 2002. All rights reserved. > (+ 3 4) 7 > Ctrl+C Bye. % 起動 終了 処理系によっては(bye), (exit), (quit)

対話環境 (REPL: Read Eval Print Loop) > (+ 3 4) 7 > (* (+ 1 2) (- 10 7)) 9 > 1234 1234 > (< (* 3 3) 10) #t (+ 3 4)の評価値 (* (+ 1 2) (- 10 7))の評価値 1234の評価値 (< (* 3 3) 10)の評価値

変数定義(1) > (define x 10) xという名前の変数を定義 x > x 10 > (* x (+ x 3)) 130 > (set! x 24) 24 xという名前の変数を定義 xの値を変更

変数定義(2):局所変数 > (let ((x 10) (y 20)) (* x (+ x y))) 300 > x Error: x is an unbound symbol.

関数定義 > (define (square x) (* x x)) > (square 10) 100 144 関数の本体 関数のパラメータ 関数の名前

階乗の計算 n! を求める関数 n=0の時 n=0でない時 > (define (fact n) (if (= n 0) 1 (* n (fact (- n 1))))) > (fact 10) 362800 n=0の時 n=0でない時

Fibonacci数の計算 1, 1, 2, 3, 5, 8, 13, … fib(n) = fib(n-1) + fib (n-2) > (define (fib n) (if (< n 2) ; fib(0) = fib(1) = 1 1 (+ (fib (- n 1)) (fib (- n 2))))) fib > (fib 10) 89

引用符(1) (quote 〈式〉) ・・・スペシャル・フォーム > (quote x) x > (quote (+ 3 4)) > (define x (quote y)) > x y

引用符(2) ’〈式〉 でも同じ意味 > ’x x > ’(+ 3 4) (+ 3 4) > (define x ’y)

リスト Lispにおける最も重要なデータ型の1つ データ(要素)の“並び”を表す Lisp = List Processor (1 2 3 4 5 6 7 8 9 10) (we eat rice) ((lions 0.543) (buffaloes 0.524) (fighters 0.514) (marines 0.510) (eagles 0.461) (hawks 0.454)) 今までデータとして数(あと真偽値)しか扱ってこなかった. リストもよく使う

リストの生成(1) 空リスト > (list 1 2 3 4) (1 2 3 4) > (list ’w ’x (list ’y ’z)) (w x (y z)) > (define x 4) > (list x (* x 5)) (4 20) > (list) () 空リスト

リストの生成(2) リストの要素がわかっている場合は、 (quote 〈リストを表す式〉) でもよい。 (quote (x y)) の略記 > ’((x y) 1 2 (a b c)) ((x y) 1 2 (a b c)) > ’(define (square x) (* x x)) (define (square x) (* x x)) (quote (x y)) の略記

リストの要素の参照 > (car ’(a b c d)) a > (cdr ’(a b c d)) (b c d) > (car (cdr (cdr ’(a b c d)))) c > (cdr (cdr (cdr (cdr ’(a b c d))))) () リストの先頭要素 先頭要素を除いたリスト

リストへの要素追加 リストの先頭に要素を追加 > (cons ’we ’(eat rice)) (we eat rice) > (cons ’never (cdr ’(we eat rice))) (never eat rice) > (cons ’(a b c) ’(x y z)) ((a b c) x y z) > (cons ’single ’() ) (single)

リストの長さを求める関数 xが()か? 「リストの長さ」の定義は? (define (my-length x) (if (null? x) (length ’(a b ...)) = 1 + (length ’(b ...)) (define (my-length x) (if (null? x) (+ 1 (my-length (cdr x))))) xが()か?

リストを結合する関数 (append ’(a b c) ’(1 2 3))  (a b c 1 2 3) 「リストを結合する」の定義は? (append () y) = y (append ’(a b ...) y) = (cons a (append ’(b ...) y)) (define (my-append x y) (if (null? x) y (cons (car x) (my-append (cdr x) y))))

リストを逆順に並べ換える関数 (reverse ’(a b c))  (c b a) 「リストを逆順にする」の定義は? (reverse (a b ...)) = (append (reverse ’(b ...)) ’(a)) (define (my-reverse x) (if (null? x) () (append (my-reverse (cdr x)) (list (car x))))) 効率は悪い

リストが要素を含むか判定 (member 4 ’(1 3 5 7 9))  #f 定義は? (define (my-member x lst) (if (null? lst) #f (if (equal? x (car lst)) lst (my-member x (cdr lst)))))

リスト処理の練習問題(自習用) but-last を定義せよ. (but-last '(1 2 3 4 5)) ⇒ (1 2 3 4) assoc を定義せよ.  (assoc hgo '((f IP) (hgo IntroAlgDS) (yan ProLang)) ⇒ (hgo IntroAlgDS)  (assoc hgo '((ishi Gairon) (iso math) (tom HW)) ⇒ #f length  を定義せよ.  (length '(1 2)) ⇒ 2  (length '(1 2 3 5)) ⇒ 4 (length nil) ⇒ 0 copy を定義せよ. (copy '(1 2)) ⇒ (1 2) (copy '((1 . 2) . (3 . 4))) ⇒ ((1 . 2) 3 . 4) flatten を定義せよ. (flatten '((1)(2 (3) 4) 5) ⇒ (1 2 3 4 5) (flatten '((1 2 3))) ⇒ (1 2 3) (flatten ' (1 2 3)) ⇒ (1 2 3) (flatten nil) ⇒ nil

式の評価 (+ (* 3 2) 5) や (define x 30) なども、それ自身は単なる リスト > (list ’+ (list ’* 3 2) 5) (+ (* 3 2) 5) システムがこのリスト(データ)を「評価」すると、 “関数呼び出し式”として処理を行い、値を返す > (eval (list ’+ (list ’* 3 2) 5)) 11 フォーム:システムが評価できるデータ フォームでないデータを評価しようとするとエラーに なる

フォームの分類(リスト・フォーム) リスト・フォーム 関数適用 ・・・ ( 〈関数〉 〈式1〉 … 〈式n〉 ) スペシャル・フォーム define, set!, quote, if など特定の記号で始まるリスト それぞれのスペシャルフォームごとに決まった評価方法 マクロ・フォーム マクロを表す記号で始まるリスト プログラマが新しいマクロを定義できる 詳細は省略(ただし,Lispを強力たらしめる最大の特徴) (関数適用とは違う)

フォームの分類(リスト以外) 記号 その他のデータ(数値,文字列など) 変数の値が評価値になる > (define x 30) x > + #<function +> その他のデータ(数値,文字列など) それ自身が評価値となる > 123 123 > ”abcde” ”abcde”

consセル(1) 例1: (we eat rice) の内部表現 we eat rice () :consセル car部 cdr部

consセル(2) we eat rice () they x: y: 例2: (define x ’(we eat rice)) (define y (cons ’they (cdr x)) x: we eat rice () y: they

consセル(3) (cons 〈データ1〉 〈データ2〉): > (cons ’rice ’()) (rice) car部とcdr部がそれぞれ〈データ1〉,〈データ2〉 であるconsセルを作る > (cons ’rice ’()) (rice) > (cons ’eat (cons ’rice ’())) (eat rice) > (cons ’we (cons ’eat (cons ’rice ’()))) (we eat rice) rice () eat rice () = (list ’we ’eat ’rice) we eat rice ()

consセル(4) x y x y z ドット・ペア > (cons ’x ’y) (x . y) ドット・リスト > (cons ’x (cons ’y ’z)) (x y . z) x y x y z

consセル(5) x y x () x y () ドット・ペア > (cons ’x ’y) (x . y) > (cons ’x (cons ’y ())) (x y) x y x () (x . ())の略記 (x . (y . ()))の略記 x y ()

consセル(6) we 123 eat rice () they x: y: 破壊的操作 > (set-cdr! x 123)  x: (we . 123) > (set-car! x y)  x: ((they eat rice) . 123) x: we 123 eat rice () y: they

データの比較 数値どうしの比較は =, <, >, <=, >= を使うべき リストどうしの比較 (< 3 10)  #t (= 4 5)  #f リストどうしの比較 (eq? <e1> <e2>) <e1>と <e2>が同じオブジェクトなら#t (eqv? <e1> <e2>) <e1> と<e2>がeq?の関係か,同じ数値,文字,etc. なら#t (equal? <e1> <e2>) <e1> と<e2>が同じ内容(のリスト)なら#t

eq?とequal?の違い > (define x1 (list 10 20)) (10 20) > (define x2 x1) > (define y (list 10 20)) > (eq? x1 x2) #t > (eq? x1 y) #f > (equal? x1 y) x1 10 20 () x2 y 10 20 ()

equal?の定義 (define (my-equal? e1 e2) (if (pair? e1) (and (pair? e2) (my-equal? (car e1) (car e2)) (my-equal? (cdr e1) (cdr e2))) (eqv? e1 e2))) 本物のequal?は,文字列や配列にも対応

画面への出力(1) (a b c) #t (a b c)(a b c) 出力関数 > (write ’(a b c)) (a b c)(a b c) システムの出力(評価値) write関数の出力 > (begin (write ’(a b c)) (newline)) (a b c) #t write関数の出力 式を評価した結果は出力されるが,それ以外の場所でも何か出力させたいときがある システムの出力(評価値)

画面への出力(2) square (x 12) 144 > (define (square x) (write (list ’x x)) (newline) (* x x)) square > (square (* 3 4)) (x 12) 144

キーボードからの入力 入力関数 > (read) abcde > (define (prompt-fact) キーボードから入力 (display ”input: ”) (fact (read))) prompt-fact > (prompt-fact) input: 11 39916800 キーボードから入力 システムの出力(read関数の返り値) REPLのRead以外の部分で入力させたいときがある キーボードから入力 プロンプト(display関数が出力)

ファイルへ出力 > (define out (open-output-file ”outfile”)) out > out #<port to outfile> > (write (fact 7) out) 5040 > (newline out) #t > (close-output-port out) 結果を“outfile”に書き込む

ファイルから入力 > (define in (open-input-file ”infile”)) in > (read in) data #<end-of-file> > (close-input-port in) #t ”infile”からデータを1つ読み込む ファイルの終端かチェック

ファイル入出力のための関数 (call-with-output-file 〈ファイル名〉 〈関数〉): 指定されたファイルへの出力ポートを 引数として 〈関数〉を呼び出し,その返り値を返す. (call-with-input-file 〈ファイル名〉 〈関数〉): 指定されたファイルへの入力ポートを 引数として 〈関数〉は1引数の関数でなければならない。 実行終了後、ファイルは自動的に閉じられる。

call-with-output-file 例:12, 22, ..., 992 の値をファイルに書き出す。 (call-with-output-file ”square99.out” (lambda (out) (let loop ((n 1)) (if (< n 100) (begin (write (* n n) out) (newline out) (loop (+ n 1)))))))

call-with-input-file 例:ファイルから全てのデータを順に読み込んで 画面に表示する。 (call-with-input-file ”infile” (lambda (in) (let loop ((dat (read in))) (if (not (eof-object? dat)) (begin (write dat) (newline) (loop (read in)))))))

プログラムファイルのロード (load 〈ファイル名〉):ファイルに書かれている フォームを順に、全て評価する。 > (load ”square.scm”) Loading square.scm... Finished. ”square.scm” > (square 4) 16

関数実行のトレース > (trace fact) > (fact 2) 1>(fact 2) 2>(fact 1) (untrace 〈関数名〉):トレースをやめる 標準ではないが,たいていの処理系で使える. > (trace fact) > (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〉) (remainder 〈整数1〉 〈整数2〉) :割り算の余り (cf. modulo) 比較 (= 〈数値1〉 … 〈数値n〉) (< 〈数値1〉 … 〈数値n〉) (> 〈数値1〉 … 〈数値n〉) (<= 〈数値1〉 … 〈数値n〉) (>= 〈数値1〉 … 〈数値n〉)

主な組み込み関数(リスト) (length 〈リスト〉) (append 〈リスト1〉 … 〈リストn〉) (reverse 〈リスト〉)

主な組み込み関数 (等号・論理演算) 等号 論理演算 (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 〈文字列〉):〈文字列〉を含む組み込み関数、 スペシャルフォーム、マクロの一覧を表示する. > (apropos "list") dolist get-host-list list list* list-ref list-tail list->string ...

× レポートについて (define (square x) (write (list ’x x)) (newline) (* x x)) ソースコードの手書きはなるべくやめて 適当なところで改行.インデント. コメント(‘;’を使う)もできるだけつけること. × (define (square x) (write (list ’x x)) (newline) (* x x))

○ レポートについて (define (square x) (write (list ’x x)) ; 追加 (newline) ; 追加 ソースコードの手書きはなるべくやめて 適当なところで改行.インデント. コメント(‘;’を使う)もできるだけつけること. ○ (define (square x) (write (list ’x x)) ; 追加 (newline) ; 追加 (* x x))

おすすめエディタ 最低限,括弧の対応付けをハイライトしてくれる ものでないと話にならない Lispのインデントに対応しているものがよい メモ帳とか(なぜか)Wordで頑張っている人も… Lispのインデントに対応しているものがよい Windows Meadow(「設定済みMeadow」がお手軽) http://www.bookshelf.jp/soft/meadow_8.html xyzzy(作者が日本人.Meadowは癖がありすぎてちょっと…という人にはよいかも) http://www.jsdlab.co.jp/~kamei/ Linux, Mac Emacs あたりが無難

参考資料 講義のページ http://winnie.kuis.kyoto-u.ac.jp/~okuno/Lecture/08/IntroAlgDs/ TUT Schemeのマニュアル http://www.spa.is.uec.ac.jp/~komiya/tus-man/tus/ TUT Scheme Tips http://www.spa.is.uec.ac.jp/~komiya/download/tus-tips.html