jakld-lecture13.pptx

Similar documents
Microsoft PowerPoint - ProgLang-12-1.pptx

Microsoft PowerPoint - prog03.ppt

kiso2-03.key

プログラミング実習I

Functional Programming

Microsoft PowerPoint - ca ppt [互換モード]

Microsoft PowerPoint - enshu4.ppt [äº™æ‘łã…¢ã…¼ã…›]

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Cプログラミング1(再) 第2回

r3.dvi

Microsoft PowerPoint - IntroAlgDs pptx

Microsoft PowerPoint - prog08.ppt

Functional Programming

r3.dvi

プログラミングD - Java

Microsoft PowerPoint - IntroAlgDs-12-1.pptx

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

メソッドのまとめ

PowerPoint Presentation

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

Microsoft PowerPoint - IntroAlgDs-10-1.pptx

(CC Attribution) Lisp 2.1 (Gauche )

memo

Programming D 1/15

Microsoft PowerPoint - ProD0107.ppt

データ構造

Microsoft PowerPoint - 5Chap15.ppt

Prog1_10th

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

Microsoft PowerPoint - 2-LispProgramming-full

本チュートリアルについて 14 部構成 比較的簡単なトピックから 各回 プログラミング言語 任意 チュートリアルで 新しい内容 宿題 プログラミング演習 次の週 結果について発表 もしくは話し合いをする スライドは Python で Python, C++, Java, Perl についての質問い答

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

Microsoft PowerPoint - 10.ppt [互換モード]

PowerPoint プレゼンテーション

連立1次方程式Ax=bの解法:公式にしたがって解くのは,計算量大

Microsoft PowerPoint - IntroAlgDs-11-1.pptx

PowerPoint プレゼンテーション

Microsoft PowerPoint - CproNt02.ppt [互換モード]

目次 はじめに 4 概要 4 背景 4 対象 5 スケジュール 5 目標点 6 使用機材 6 第 1 章 C# 言語 7 C# 言語の歴史 7 基本構文 8 C 言語との違い 9 Java 言語との違い 10.Netフレームワーク 10 開発資料 10 第 2 章 Mono 11 Monoの歴史 1

プログラミング入門 第 1 回 導入 プログラムの基礎 教科書 二宮崇 ( ) Structure and Interpretation of Computer Programs, 2nd Edition: Harold Abelson, Gera

デジタル表現論・第6回

講習No.9

memo

memo

PowerPoint プレゼンテーション

Java講座

PowerPoint プレゼンテーション

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

Microsoft PowerPoint - prog07.ppt

プログラミング入門1

Microsoft Word - java a.doc

Functional Programming

02: 変数と標準入出力

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

Taro-再帰関数Ⅲ(公開版).jtd

Microsoft PowerPoint - ml1.ppt

slide5.pptx

メソッドのまとめ

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

ポインタ変数

文字列操作と正規表現

Microsoft PowerPoint - IntroAlgDs-09-1.ppt [互換モード]

Microsoft PowerPoint - ruby_instruction.ppt

PowerPoint プレゼンテーション

Microsoft PowerPoint - 09.pptx

プログラミング基礎I(再)

Microsoft PowerPoint - IntroAlgDs-05-7.ppt

Microsoft PowerPoint - lec10.ppt

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

プレポスト【解説】

JavaプログラミングⅠ

プログラミング入門1

PowerPoint Presentation

情報処理Ⅰ

2006年10月5日(木)実施

プログラミング基礎

02: 変数と標準入出力

JavaプログラミングⅠ

プログラミングI第10回

program7app.ppt

1

プログラムの基本構成

つくって学ぶプログラミング言語 RubyによるScheme処理系の実装

Microsoft PowerPoint - prog04.ppt

GEC-Java

演算増幅器

オートマトンと言語

PowerPoint Presentation

講習No.1

PowerPoint プレゼンテーション

Prog1_12th

PowerPoint プレゼンテーション

※ ポイント ※

プログラミング入門1

Microsoft PowerPoint - prog04.ppt

#include<math.h> 数学関係の関数群で sin() cos() tan() などの三角関数や累乗の pow() 平方根を求める sqrt() 対数 log() などがあります #include<string.h> 文字列を扱う関数群 コイツもまた後日に 4. 自作関数 実は 関数は自分

Microsoft PowerPoint - IntroAlgDs-05-2.ppt

Transcription:

1 大学院情報学研究科知能情報学専攻知能メディア講座音声メディア分野 http://winnie.kuis.kyoto-u.ac.jp/~uno/lecture/10/introalgds/ uno@i.kyoto-u.ac.jp, uno@nue.org TA の居室は総合研究 7 号館 4 階 418 号室 (M1) 奥乃研 音楽情報処理 G (M1) 奥乃研 ロボット聴覚 G (M1) 奥乃研 ロボット聴覚 G 世界中のComputer Scienceのトップレベルの教科書 ( 過去 20 年間 ) 1 回生後期で前半を 2 回生前期で後半を ( 五十嵐先生 ) MIT Press オンライン版 ( 無料 ) http://mitpress.mit.edu/sicp/full-text/bo/ bo.html Emacs Texinfo 形式 ( 無料 ) http://www.neilvandyke.org/sicp-texi/ 日本語訳 ( 邦訳 絶版 ) 約 4.5K 円 教科書は持っているものとして進めます. 3 1. 教科書を読む 2. 想定質問を考える 3. 想定質問に答える 4. 授業前日 (23 時 ) までに Mail でレポートを提出 学籍番号, 入学年, 学科, 氏名 想定質問を書く 想定質問の回答を書く 5. 第 1 回目は, 教科書 1-1-1~1-1-3 まで読み, レポートを Mail で提出 (10 月 7 日 23 時締切 ) SICP-1@zeus.kuis.Kyoto-u.ac.jp 1

4 1. JAKLD Scheme( 湯淺研開発 教育用計算機 ) Java 版 (stand-alone, 携帯 OK), 他に Windows,Cygwin, Linux 版あり, http://www.yuasa.kuis.kyoto-u.ac.jp/~yuasa/jakld/index-j.html Android 版 (1 回生の坂東君随意課題として作成 ) http://sigma-project.net/2011/01/25/androscheme/ 2. 教育用計算機を使用.Install は不要. 3. 他の処理系は 4. 世界中に SICP のサイト コースウェア等あり 5. 宿題は自分でやること ( ) 6. Plagiarism( 剽窃 ) は不正行為! 5 1. 試験 70% 2. 必修課題 30% 1 事前課題.Mail で提出, 次回講義前日 23 時締切 SICP-n@zeus.kuis.Kyoto-u.ac.jp (nは回数) 2 図形言語レポート ( プログラムはメイルで提出 ) 3. 加算システム : 随意課題提出による +α 1 第 2 章までのすべての練習問題 2 Fixed-Point 探索過程のSchemeによる可視化 3 アルゴリズムのSchemeによる可視化 4 抽象化によるSchemeプログラム ( 線形計画法, 整数論, 群論, 組合せ論, 古典力学, パズル解法, ゲーム, 数独 ) 5 Lego Mindstorm 用 Lisp XSを使った自律ロボット 6 図形言語で circle-limit ( 難しいが提出者 2 名あり ) 7 他の学生の支援 6 過去 6 年間の実績本講義受講者の最終成績の平均点は 2

7 落ちこぼれゼロ化作戦 TA3 名が担当の学生の合格率向上を競う. 8 疑問等あれば, 教員 TA に質問を. 自分で考える癖を付けること. 7 号館 4 階 TA 居室講義直前の昼休 (12:45~) 講義 TAのWeb で (http://winnie.kuis.kyoto-u.ac.jp/) 9 1. Scheme の基本を学ぶ JAKLD の使い方 SICP に載ってないが実際のプログラミングで必要になる知識あれこれ OHP のマーク 教科書のまとめ 3

10 1. John McCarthyが1959 年に設計 開発 http://www-formal.stanford.edu/jmc/recursive.html 2. Fortran 言語についで2 番目に古い言語 3. 種々の方言 実装あり Schemeもその一つ MacLisp, Interlisp, TAO, Kyoto Common Lisp, 4. 今日のオブジェクト指向などさまざまなアイデアを創出してきた 5. 人工知能システム発達の 6. 統合的プログラミング環境が提供 7. TRON(Disney) 最初のCGによる映画 8. Pluto(134340) の軌道がChaoticの計算による証明 - Galileo 以来の open problemの解決 11 弟子さん : 佐藤雅彦教授 ( 情報 ), 林晋教授 ( 文学部, 岩波文庫 ゲーデルの不完全性定理 訳者 ), 居候 : 奥乃 12 \documentclass[a4paper,12pt]{article} \usepackage{listings} \begin{document} \lstset{numbers=left,basicstyle=\small} \lstinputlisting{fact.scm} 以上で, ファイル fact.scm に書かれたプログラムのリスティングが得られる. その下にプログラムの説明を書く. http://winnie.kuis.kyoto-u.ac.jp/~uno/ Lecture/12/IntroAlgDs/listing.tar.gz にサンプルあり. \end{document} 4

Scheme 入門 JAKLD の使い方 通信情報システム専攻五十嵐研究室助教馬谷誠二 umatani@kuis.kyoto-u.ac.jp 内容 Scheme プログラミング入門 JAKLD 処理系の利用例 教科書の 1.1.6 節まで + α 対話環境 (REPL) の使いかた 評価と副作用 ( 入出力など ) 関数の呼出しと定義 基本的なデータ型 コードとデータの区別 ( クォート ) リスト操作 etc. Lisp 言語 John McCarthy によって発明 (1958 年 ) FORTRAN(1957 年 ) に次いで 2 番目に古い 特徴 1. リスト処理が得意 (List Processor) 2. 対話環境 3. 動的型付け, 関数型プログラミング, ごみ集め処理 やりたいこと だけに集中してプログラムが書ける rapid prototyping 4. プログラム ( リスト ) を Lisp 自身で扱うことができる 書きたいプログラムに合わせて言語自体を拡張 You can write your own language on Lisp (Paul Graham, On Lisp, http://www.paulgraham.com/onlisp.html) 5

Scheme Lispの方言の一つ プログラミング言語として本当に必要な部分だけをできるだけコンパクトにまとめた仕様 言語仕様 (R5RS) は50ページ (2007/09に成立した新仕様(R6RS) で3 倍以上に増え, 一部反発. 現在はR7RSの策定中 ) C(C99) は538ページこっちが混ざってたら Common Lisp( 第 2 版 ) は1029ページゴメンナサイ 真の末尾再帰呼び出しをサポート 繰り返し構文 (Cでいうwhileなど) を持たない 継続オブジェクト 実行中の処理の 残りの計算 をプログラムで扱える 例外処理, 並行計算, イベント駆動プログラミング,etc. Why Scheme? なぜ 1 回生から Scheme を習うのか ( 個人的主観 ) 1. 関数型プログラミングは分かりやすい, かつ強力 最近主流の言語の理解にもつながる 2. 言語仕様がコンパクト習得が容易 3. 対話環境 4. (SICP が使ってるから J ) 本講義では湯淺先生作成の Scheme 処理系 JAKLD (JAva Kumikomi-you Lisp Driver) を使用 Java ( JVM ) 上で動作 使い始めるのが簡単 教科書に出てくるコード ( 図形言語含む ) を完全サポート JAKLD 導入 入手 & インストール 前提条件 : Java 処理系がインストールされている事 湯淺先生の下記のページから jar ファイルを入手 http://www.yuasa.kuis.kyoto-u.ac.jp/~yuasa/jakld/index-j.html 対話環境の起動 $ java -jar jakld.jar JAKLD for SICP (October 10, 2008) (c) Copyright Taiichi Yuasa, 2002. All rights reserved. > 終了 > Ctrl-D (Control キーと D キーを同時に入力 ) Sayonara $ 6

REPL (Read-Eval-Print Loop) プログラムを読み (read), 評価 (evaluate) し, 結果を表示 (print) を繰り返す (loop) 例 : 簡単な算術式 > (+ 1 2) 3 > (< (* (+ 1 2) 3) 10) #t > Scheme ではすべて前置記法 (prefix notation) で書く (<operator> <operand1> <operand2> ) Hello! World in C 新しいプログラミング #include<stdio.h> 言語を習う時, まずはじめに int main (void) すること { printf ( Hello! World\n ); return 0; } % gcc hello.c %./a.out Hello! World Hello! World in Scheme Scheme ならこんなに簡単 % java jar jakld.jar > (begin (display Hello World!") (newline)) Hello! World #t 7

Hello world: つづき (display < 式 >) < 式 > の評価結果を表示 任意の型の値を表示可能 ( 人間にとってなるべく見やすい表現 ) (newline) 改行を表示 (begin < 式 1> < 式 2> < 式 n>) 左から右へ順に評価し, 最後の式の評価結果を begin 式の 評価結果として返す Hello world: つづき さきほどの JAKLD の応答を見直すと : % java jar jakld.jar > (begin (display Hello World!") (newline)) Hello! World ; 画面への表示 #t ;(newline) の評価結果 変数の定義と代入 (define < 変数名 > < 式 >) (set! < 変数名 > < 式 >) > (define greeting "Hello World! ) > (begin (display greeting) (newline)) Hello World! #t > (define x 1) > (+ x 1) 2 > (set! x 10) 10 >(+ x 1) 11 8

評価と副作用 評価 : 式の値を求める計算プロセス 副作用 : 評価に伴う副次的効果 ( 入出力など ) (* (+ 1 2) 3) (* 3 3) 9 (display "Hello World!") [Hello World を画面に表示 ] 未定義 ( 何か仮定してはいけない ) (define greeting "Hello World!") [ 変数 greeting を文字列に束縛 ] 未定義 ( 何か仮定してはいけない ) set!, newline も同様 手続き ( 関数 ) 定義 f(x) 何度も同じコードを入力するのは手間 部分的に異なるだけのコードをまとめたい 数学的関数 f(x): 引数 x 毎に異なる値 (define (< 関数名 > < 引数 > ) < 関数本体 ( 式 )>) x > (define (abs x) (if (>= x 0) x (- x))) > (abs -3) ; or (abs (- 3)) 3 > (abs 5) 5 再帰呼出し 定義中の関数を, 関数本体中で呼び出せる 例 : 階乗計算 1 (n = 0のとき ) n! = n (n 1)! ( それ以外 ) > (define (fact n) (if (= n 0) 1 (* n (fact (- n 1))))) > (fact 10) 3628800 9

局所変数定義 (let ((< 変数 1> < 式 1>)... (< 変数 n> < 式 n>)) < 本体 >) < 本体 > 中でのみ有効な変数を定義 > (define x 1) > (let ((x 10)) (+ x 1)) 11 > (+ x 1) 2 X^2 + y^2 の sqrt の少し意味ある例に Hello world その 2 > (define (helloworld-1) (display "Hello World! ) (newline)) > (define (helloworld-2) (display "Hello ) (display " ) (display "World! ) (newline)) 局所関数定義 > (define (helloworld-3) (define (hw greeting) (display greting) (newline)) (hw "Hello World!")) > hw RuntimeException: undefined variable hw at top-level データ型 データの型とは? おおざっぱに言うと 種類 それぞれに可能な操作は決まっている例. シンプルなデータベース apple 150 8 orange 80 12 peach 250 5 mango 600 3 watermelon 3000 1 10

代表的な組込みデータ型 数 : 1, 10, -3, 3.14, 3.0e8 文字列 : Hello world! 文字 リスト シンボル まずは文字列操作について少し 教科書には殆ど出てきませんが 現実世界には処理されるのを待っているテキストであふれている. 文字列操作関数 (1) (string-length < 文字列 >): 文字列の長さを返す > (string-length "Hello World! ) 12 > (string-length (+ 1 2)) RuntimeException: 1st argument 3 to stringlength not String object > 文字列操作関数 (2) (string-append < 文字列 1> < 文字列 2>... < 文字列 n>) 文字列の連結 > (define (helloworld-4) (string-append "H" "e" "l" "l" "o" " " "W" "orld!")) ちなみに : > (string-append "Hello World! ) "Hello World!" > (string-append) "" 11

文字列操作関数 (3) (substring < 文字列 > <i> <j>) i 番目から j 番目までの文字を含んだ部分文字列を返す ( j は省略可能 ) > (define (helloworld-5) (let ((sentence "Hello again. Small world! )) (display (substring sentence 0 6)) (display (substring sentence 19)) (newline))) 組込みデータ型 数 : 1, 10, -3, 3.14, 3.0e8 文字列 : Hello world! 文字 リスト シンボル 文字 #\c: 文字のならびではなく 1 文字だけからなるデータ (string < 文字 1> < 文字 2>... < 文字 n>) > (define (helloworld-6) (display (string #\H #\e #\l #\l #\o #\ #\W #\o #\r #\l #\d #\!))) (string-ref < 文字列 > <i>) > (string-ref "Hello World" 6) #\W なぜ素直に (string H e l l o...) と書けない? 試せばすぐ分かる シンボル ( 後述 ) 12

代表的な組込みデータ型 数 : 1, 10, -3, 3.14, 3.0e8 文字列 : Hello world! 文字 リスト シンボル Scheme (Lisp) プログラミングで最も重要なデータ型はこの 2 つです! リスト 任意のデータのならび ( 文字列は文字のならび ) (list < 式 1> < 式 2>... < 式 n>) > (list "Hello" " " "World! ) ("Hello" " " "World!") > (list 1 3.14 "Hello" #\W) (1 3.14 "Hello" #\W) > (list) () ; 空リスト > nil () ; 空リスト (JAKLD only) リスト操作関数 (1) 基本操作関数 (cons < 式 > < リスト >): < 式 > の値を < リスト > の先頭に追加 (car < リスト >): < リスト > の先頭の要素を返す (cdr < リスト >): 先頭の要素を除いた < リスト > を返す > (define l (list "Hello" " " "World!")) > (cons "Again, " l) ("Again, " "Hello" " " "World!") > (car l) "Hello" > (cdr l) (" " "World!") cadr (= (car (cdr < リスト >))), cddr, caddr, : 便利な記法 13

例 > nil () > (cons 1 nil) (1) > (cons 2 (cons 1 nil)) (2 1) > (cons 3 (cons 2 (cons 1 nil))) (3 2 1) > (define l (cons 3 (cons 2 (cons 1 nil)))) > (car l) 3 > (cadr l) ; (car (cdr l)) 2 > (caddr l) ;; (car (cdr (cdr l))) 1 リスト操作関数 (2) > (define l (list "Hello" " " "World!")) > (length l) 3 > (append (list "You" " " "said," " ") l) ("You" " " "said," " " "Hello" " " "World!") > (reverse l) ("World!" " " "Hello") > (map abs (list 1-2 3 4-5)) (1 2 3 4 5) > (begin (foreach display l) (newline)) Hello World! #t 上の関数 ( と先程の list 関数も ) はすべて自分で定義することも可能 ( 本講義ですぐに学びます ) リストを結合する関数 (append (list 1 2 3) (list 4 5 6)) (1 2 3 4 5 6) リストを結合する の定義は? (append () y) = y (append (a b...) y) = (cons a (append (b...) y)) 答 : > (define (append x y) (if (null? x) y (cons (car x) (append (cdr x) y)))) 14

プログラムの読み込み これまでの手続き定義が全て jakldtut.scm という名前のファイルに入っているとする > (load "jakldtut.scm") "jakldtut.scm ファイル中で define している変数や関数を使用できる > (helloworld-2) Hello World ( 注 ) ファイル中に式を書くだけでは JAKLD は評価結果を表示しません クォート ( 引用,quote) プログラムとデータの区別 (+ 1 2)... 1と2を足す プログラム (1 2 3 4)... 4つの整数からなるリスト ( データ )... というのは人間の勝手な解釈! REPL は何でもプログラムと解釈する (quote < 式 >) < 式 > をデータとして扱うためのスペシャルフォーム 通常の関数呼出しと異なり,< 式 > を評価せずそのまま返す 省略記法 : < 式 > = (quote < 式 >) その他のスペシャルフォーム : (define x 1) 数, 文字列, 文字は? $ 自分自身に評価されるプログラム Hello world その 3 > (define (helloworld-7) (foreach display (list "Hello" " " "World! )) (newline)) > (define (helloworld-8) (foreach display '("Hello" " " "World! )) (newline)) > (define (helloworld-9) (foreach display '("H" "e" "l" "l" "o" " " "W" "o" "rld! )) (newline)) > (define (helloworld-10) (foreach display '(#\H #\e #\l #\l #\o #\ #\W #\o #\r #\l #\d #\!)) (newline)) 15

シンボル ( 記号 ) > 'hello hello 文字と何がちがう? 1 文字以上書ける 文字列と何がちがう? 分割や結合ができない... といった些細な事ではない本質的な違い : シンボルをプログラムとして見ると変数になる > (define hello "Hello World!") > (display hello) Hello World! 逆に, プログラムをクォートするとデータになる > (define prog '(list "Hello" " " "World!")) > (car prog) list ; これはシンボル シンボル ( 記号 ): つづき ちなみに : > (for-each display '("Hello" " " "World!")) 実は for-each, display も通常の変数 評価した結果の値が手続きオブジェクト (define for-each < 手続きオブジェクト >) (define display < 手続オブジェクト >) < 手続オブジェクト > の詳細は次回以降の講義にて (lambda 式 ) Hello world その 4 クォートによるシンボルデータと変数の両方を使った ( 作為的な ) 例 : > (define (helloworld-11) (let ((space " ") (wor "Wor")) (for-each display (append '(He llo) (list space wor) '(ld!))) (newline))) > (helloworld-11) Hello World! #t 16

再帰的な手続きの定義 中身を知らない for-each に頼りたくない! という方へ もちろん, 自分でもリストに対する Hello World プログラムを定義できます 復習 : factorial > (define (fact n) (if (= n 0) 1 (* n (fact (- n 1))))) > (fact 16) 20922789888000 Hello world その 5 > (define (helloworld-12) (define (display-list xs) (if (null? xs) (newline) (begin (display (car xs)) (display-list (cdr xs))))) (display-list '("Hello" " " "World!"))) > (helloworld-12) Hello World! #t 仕様と実装 1 つの要求仕様に対して様々な実装が有り得る helloworld-1~helloworld-12 はどれも正解 現実には, 有り得る実装から最良なものを選択すべき 評価指標 実行速度, 実装コスト ( 手間 ), 可読性, メンテナンス性, 消費電力, など 実行効率と実装コストは一般にはトレードオフ (define (slow-reverse x) (if (null? x) () (append (slow-reverse (cdr x)) (list (car x))))) (define (fast-reverse x) (fast-reverse-aux x ())) (define (fast-reverse-aux x acc) (if (null? x) acc (fast-reverse-aux (cdr x) (cons (car x) acc)))) 17

c.f. length のつくり方も色々 再帰定義版 (define (length l) (if (null? l) 0 (+ 1 (length (cdr l))))) map-reduce 版 (fold left は教科書 2.2.3 節なので, フライング気味...) (define (length l) (fold-left + 0 (map (lambda (x) 1) l))) etc. キーボードからの入力 入力関数 > (read) abcde キーボードから入力 abcde システムの出力 (read 関数の返り値 ) > (define (prompt-fact) (display input: ) (fact (read))) prompt-fact > (prompt-fact) input: 11 キーボードから入力 39916800 プロンプト (display 関数が出力 ) データ構造の入力 read が読み込むのは, シンボルや整数に限らない たとえば, リスト全体の読み込みが可能 例 1: シンプルデータベース > (define record (read)) (( apple 150 8) ( orange 80 12)) ; キーボードから入力 例 2: プログラム > (define prog (read)) (+ (* 7 3) 4) ; キーボードから入力 > (cadr prog) (* 7 3) 18

eval (eval < 式 >) < 式 >: 評価したいプログラムのデータ表現 > (define prog1 '(+ (* 7 3) 4)) > (eval prog1) 25 > (define prog2 (list '- (cadr prog1) (caddr prog1))) > prog2 (- (* 7 3) 4) > (eval prog2) 17 REPL の定義 ( 簡易版 ) > (define (repl) (display >> ) (let ((input (read))) (let ((result (eval input))) (display result) (newline) (repl)))) eval, REPL の実装の詳細は,2 回生前期 プログラミング言語 にて 今日の説明は, あくまで近似的理解のため 以上 何か質問がありましたら : umatani@kuis.kyoto-u.ac.jp まで. 19