sp-5. リスト,シンボル,文字
1
金子邦彦
Scheme プログラミング)
URL: https://www.kkaneko.jp/pro/scheme/index.html
トライン
5-1 リストとは
5-2 Scheme プログラムでのリストの記法
list
5-3 リストに関する演算子
first, rest, empty?, length, list-ref, append
5-4 数字,シンボル,文字列を含むリスト
5-5 パソコン演習
5-6 課題
2
5-1 リストとは
3
15 32 23
データの並び
データに順序がある
リストとは
4
5-2 Scheme でのリストの表記
5
(list 15 8 6 32 23)
リストであることを
示すキーワード 本体の部分
これ自体が1つの式
Scheme でのリストの記法
6
first
先頭のこと
rest
先頭を取り除いた残り
rest もまたリスト
例) 上のリストの rest rest rest first は:
15 32 23
first rest
first rest
7
empty は「空リスト」を表す特別な記
rest との関係
リストの長さが1の時には,empty
例)
(rest (list 15))
= empty
empty
8
空で無い
リスト
空リス
数値
first OK 実行エ
ラー
実行エ
ラー
rest OK 実行エ
ラー
実行エ
ラー
要するに,「空でないリスト」だけ,first,
rest が実行できる
first, rest に関する実行エラー
9
first, rest に関する実行エラーの例
DrScheme の実行画面
10
empty? は,リストが空リストであるかを調べる
empty? の意味
「空リスト」ならば true (さもなければ false
empty?
11
リストに関する演算
first リストの先頭の要素
(例) (first (rest (rest a-list)))
rest リストから先頭の要素を除いた残り
(例) (rest a-list)
empty? リストが空リストであるか調べる
(例) (empty? a-list)
list
list リストを記述するためのキーワード
(例) (list 15 8 6 32 23)
リストに関するキーワード
12
5-3 リストに関する演算子
13
length
リストの要素の個数
list-ref
リストのn番目の要素(先頭は0番目)
append
リストの連結
リストに関する演算子
14
length の意味
リストの要素の個数
リストで無い場合には
実行エラーとなる
length
15
list-ref の意味
リストのn番目の要素(先頭は0番目)
リストで無い場合には
実行エラーとなる
指定した番号が大きすぎる
と実行エラーとなる
list-ref
16
append の意味
リストの連結
リストで無い場合には
実行エラーとなる
append
17
5-4 数字,シンボル,文字列を含むリ
スト
18
記号」や「単語」を表す
カッコ、ダブルクオーテーションマーク,空白,コン
マはシンボルとして使えない
(例) 'the
'a
'cat!
'tow^3
'and%so%on
'」が無いと,変数名の意味になる
シンボル
19
symbolの比較演算子
(symbol=? 'Hello 'Hello) true
(symbol=? 'Hello 'Hallo) false
symbol=? の意味
20
本当は「symbol=?」と書くべき.
しかし,「=」と書いている.
実行すると,エラー
メッセージが出る
よくある間違い
21
文字列: "」で囲む
"This is a string"
空白文字なども「文字列」として使え
文字列
22
数値同士の比較
<, <=, =, >=, > など
シンボル同士の比較
symbol=? など
文字列同士の比較
string<?, string<=?, string=?, string>=?,
string>? など
さまざまな比較演算
23
atomic
数値
true, false
変数名
シンボル
文字列
empty,
など
括弧の入った式 (compound)
(演算子 式の並び) (関数名 式の並び)
(cond [(条件式) ] ... ) (list 式の並び)
関数の定義式
(define (関数名 数の並び)
)のパターン
のパターン
など
Schemeの式
24
数値:
5, -5, 0.5 など
true, false
true, false
シンボル,文字列
変数名
empty
四則演算子:
+, -, *, /
比較演算子
<, <=, >, >=, =
奇数か偶数かの判定
odd?, even?
論理演算子
and, or, not
リストに関する演算子
first, rest, empty?, length, list-ref, append
その他の演算子:
remainder, quotient, max, min,
abs, sqrt, expt, log, sin, cos, tan
asin, acos, atan など
括弧
(, ), [, ]
関数名
define
cond
list
Scheme の式
25
5-5 パソコン演習
26
資料を見ながら,「例題」を行ってみる
各自,「課題」に挑戦する
各自で自習 巡回指導
自分のペースで先に進んで構いません
パソコン演習の進め方
27
DrScheme の起動
プログラム PLT Scheme → DrScheme
今日の演習では「Intermediate Student
に設定
Language
→ Choose Language
→ Intermediate Student
→ Execute ボタン
DrScheme の使用
28
29
例題1.リストの式
リストの式を書く
リストの式を書くために listを使
15 32 23
1. 次の式を「実行用インド」で,
実行しなさい
(list 15 8 6 32 23)
次は,例題2に進んでください
「例題1.リストの式」の手順
30
(list 15 8 6 32 23)
と表示される
(list 15 8 6 32 23)
を入力すると
実行結果の例
31
32
コンピュータが行っていること
コンピュータ
(Scheme 搭載)
Scheme の式
式の実行結果
(list 15 8 6 32 23)
を入力する
と・・・
(list 15 8 6 32 23)
がそのまま表示され
例題2.リストの first rest
リスト (list 15 8 6 32 23) に対して,
first rest を実行する
15 32 23
first rest
例)
33
1. 次の式を「実行用インド」で,実行し
なさい
(first (list 15 8 6 32 23))
(rest (list 15 8 6 32 23))
次は,例題3に進んでください
「例題2.リストの first rest」の手
34
first の実行結果
restの実行結果
実行結果の例
35
36
first
コンピュータ
(Scheme 搭載)
Scheme の式
式の実行結果
(first (list 15 8 6 32 23))
を入力すると・・・
15
が表示される
リストの先頭の要素
37
rest
コンピュータ
(Scheme 搭載)
Scheme の式
式の実行結果
(list 8 6 32 23)
が表示される
リストから先頭の要素を
除いた残り
(rest (list 15 8 6 32 23))
を入力すると・・・
要素が1つしか無いリスト (list 15)
に対して,first rest を実行する
15
first rest
例)
empty
例題3.リストの first rest
38
1. 次の式を「実行用インド」で,実
しなさい
次は,例題4に進んでください
(first (list 15))
(rest (list 15))
「例題3.リストの first rest」の手
39
first の実行結果
restの実行結果
実行結果の例
40
41
first
コンピュータ
(Scheme 搭載)
Scheme の式
式の実行結果
(first (list 15))
を入力すると・・・
15
が表示される
リストの先頭の要素
42
rest
コンピュータ
(Scheme 搭載)
Scheme の式
式の実行結果
(rest (list 15))
を入力すると・・・
empty
が表示される
リストから先頭の要素を
除いた残り
リストをつなげる関 append を使ってみる
append Scheme が備えている関数
例題4.append
43
1. 次の式を「実行用インド」で,実
しなさい
(append (list 1 2) (list 3 4))
(append (list 1 2) (list 3 4) (list 5 6))
(append (list 1 2) 3 (list 4 5))
次は,例題5に進んでください
「例題4.append 」の手順
44
2つのリストを併合
3つのリストを併合
リストでないものは
併合できない 45
リストの3番目の要素を得る関数
element3 を作り,実行する
first, rest の組み合わせ
15 32 23
例)
3番目
例題5.リストの基本操作
46
リストの3番目
リストの rest rest first
15 32 23
例)
rest rest
first
リストの基本操作
47
1. 次を「定義用インド」で,実行しなさい
入力した後に,Execute ボタンを押す
(define (element3 a-list)
(first (rest (rest a-list))))
2. その後,次を「実行用インドで実行しなさい
次は,例題6に進んでください
(element3 (list 1 2 3 4))
(element3 (list 15 8 6 32 23))
「例題5.リストの基本操作」の手順
48
まず,Scheme のプログラムを
コンピュータに読み込ませている
49
これは,
(element3 (list 15 8 6 32 23))
と書いて,a-list の値を
(list 15 8 6 32 23) に設定しての実行
実行結果である「6」が
表示される 50
element3
(list 15 8 6 32 23)
6
入力 出力
入力と出力
51
(define (element3 a-list)
(first (rest (rest a-list))))
値を1つ受け取る(入力)
関数の名前
「関数である」ことを
示すキーワード
a-list の値から
3番目の要素を求める(出力)
element3 関数
52
(element3 (list 15 8 6 32 23))
= (first (rest (rest (list 15 8 6 32 23))))
= (first (rest (list 8 6 32 23)))
= (first (list 6 32 23))
= 6
(element3 (list 15 8 6 32 23)) から6が得られる過程
最初の式
コンピュータ内部での計算
(first (rest (rest a-list)))
a-list = (list 15 8 6 32 23)
代入される
実行結果
(rest (list 15 8 6 32 23)) → (list 8 6 32 23)
(rest (list 8 6 32 23)) → (list 6 32 23)
53
(element3 (list 15 8 6 32 23)) から6が得られる過程
(element3 (list 15 8 6 32 23))
= (first (rest (rest (list 15 8 6 32 23))))
= (first (rest (list 8 6 32 23)))
= (first (list 6 32 23))
= 6
これは,
(define (element3 a-list)
(first (rest (rest a-list))))
a-list (list 15 8 6 32 23) で置き換えたも
54
リストの長さが2以下の時には,「エラーメッ
セージ」が表示され
例)
(element3 (list 1 2))
エラーメッセージが表示される
関数 element3 について
55
これは,
(element3 (list 1 2))
と書いて,a-list の値を
(list 1 2) に設定しての実行
エラーメッセージが
表示される 56
(element3 (list 1 2))
= (first (rest (rest (list 1 2)))
= (first (rest (list 2)))
= (first empty)
(element3 (list 1 2)) から
実行エラーに至る過程
最初の式
コンピュータ内部での計算
(first (rest (rest a-list)))
a-list = (list 1 2)
代入される
(rest (list 1 2)) → (list 2)
(rest (list 1)) → empty
「空リスト empty に対して first 実行できない」
とい決まりがあるので,実行エラー 57
の値から,3種類のシンボル('Cold, 'Warm,
'Hot)のどれかを出力する関 judge を作り,実
行する
x 20 → 'Cold
20 < x 30 → 'Warm
30 < x → 'Hot
シンボル
例題6.シンボル
58
1. 次を「定義用インド」で,実行しなさい
入力した後に,Execute ボタンを押す
;;judge: number -> symbol
(define (judge x)
(cond
[(<= x20) 'Cold]
[(and (< 20 x) (<= x30)) 'Warm]
[(< 30 x) 'Hot]))
2. その後,次を「実行インド」で実行しなさい
次は,例題7に進んでください
(judge 15)
(judge 20)
(judge 25)
「例題6.シンボル」の手順
59
まず,Scheme のプログラムを
コンピュータに読み込ませている
60
ここでは,
(judge 15)
と書いて,xの値を 15
に設定しての実行
実行結果である「'Cold」が
表示される
61
judge
'Cold
入力 出力
x の値:
15
入力は
1つの数値
出力は
1つのシンボル
入力と出力
62
;; judge: number -> symbol
(define (judge x)
(cond
[(<= x20) 'Cold]
[(and (< 20 x) (<= x30)) 'Warm]
[(< 30 x) 'Hot]))
値を1つ受け取る(入力)
関数の名前
「関数である」ことを
示すキーワード
judge 関数
63
の値から,数字あるいはシンボルを出力する
ast を作り,実行する
x > 0 ならば: x の値を出力する
x 0 ならば: '*」を出力する
例題7.数字かシンボルを出力
64
1. 次を「定義用インド」で,実行しなさい
入力した後に,Execute ボタンを押す
(define (ast x)
(cond
[(> x0) x]
[else '*]))
2. その後,次を「実行用インドで実行しなさい
次は,例題8に進んでください
(ast 10)
(ast 0)
(ast -10)
「例題7.数値かシンボルを出力」の手順
65
まず,Scheme のプログラムを
コンピュータに読み込ませている
66
ここでは,
(ast 10)
と書いて,xの値を 10
に設定しての実行
実行結果である「10」が
表示される
67
ast
15
入力 出力
x の値:
10
入力は
1つの数値
出力は
1つの数値
あるいはシンボル
入力と出力
68
(define (ast x)
(cond
[(> x0) x]
[else '*]))
値を1つ受け取る(入力)
関数の名前
「関数である」ことを
示すキーワード
ast 関数
69
次の4種のシンボルから,「答え」を返すよ
関数 reply を作り,実行する
'GoodMorning 'Hi
'HowAreYou 'Fine
'GoodAfternoon 'NeedANap
'GoodEvening 'BoyAmITired
答え
これ以外の入力に対しては,実行エラー
例題8.シンボル
70
1. 次を「定義用インド」で,実行しなさい
入力した後に,Execute ボタンを押す
;;reply: symbol -> symbol
;;to determine a reply for the greeting s
(define (reply s)
(cond
[(symbol=? 'GoodMorning s) 'Hi]
[(symbol=? 'HowAreYou s) 'Fine]
[(symbol=? 'GoodAfternoon s) 'NeedANap]
[(symbol=? 'GoodEvening s) 'BoyAmITired]))
2. その後,次を「実行用インドで実行しなさい
次は,課題に進んでください
(reply 'GoodMorning)
(reply 'Hello)
「例題8.シンボル」の手順
71
まず,Scheme のプログラムを
コンピュータに読み込ませている
72
ここでは,
(reply 'GoodMorning)
と書いて,xの値を 'GoodMorning
に設定しての実行
実行結果である「'Hi」が
表示される
73
ここでは,
(reply 'Hello)
と書いて,xの値を 'Hello
に設定しての実行
実行エラーが
発生する
74
reply
'Hi
入力 出力
x の値:
'GoodMorning
入力はシンボル 出力はシンボル
入力と出力
75
;; reply: symbol -> symbol
;; to determine a reply for the greeting s
(define (reply s)
(cond
[(symbol=? 'GoodMorning s) 'Hi]
[(symbol=? 'HowAreYou s) 'Fine]
[(symbol=? 'GoodAfternoon s) 'NeedANap]
[(symbol=? 'GoodEvening s) 'BoyAmITired]))
reply 関数
76
本当は「symbol=?」と書くべき.
しかし,「=」と書いている.
実行すると,エラー
メッセージが出る
よくある間違い
77
(define (reply s)
(cond
[(symbol=? 'GoodMorning s) 'Hi]
[(symbol=? 'HowAreYou s) 'Fine]
[(symbol=? 'GoodAfternoon s) 'NeedANap]
[(symbol=? 'GoodEvening s) 'BoyAmITired]))
判定順
cond 文に並べた条件式は,上から順に判定され
上の例では,の順に判定が行われ,
が成り立てば,は判定されない
条件式の並べ方に意味がある
条件式の判定順
78
(reply 'GoodMorning)
= (cond
[(symbol=? 'GoodMorning 'GoodMorning) 'Hi]
[(symbol=? 'HowAreYou 'GoodMorning) 'Fine]
[(symbol=? 'GoodAfternoon 'GoodMorning) 'NeedANap]
[(symbol=? 'GoodEvening 'GoodMorning) 'BoyAmITired])
= (cond
[true 'Hi]
[(symbol=? 'HowAreYou 'GoodMorning) 'Fine]
[(symbol=? 'GoodAfternoon 'GoodMorning) 'NeedANap]
[(symbol=? 'GoodEvening 'GoodMorning) 'BoyAmITired]) =
'Hi
(reply 'GoodMorning) から 'Hi が得られる過程
79
(reply 'GoodMorning)
= (cond
[(symbol=? 'GoodMorning 'GoodMorning) 'Hi]
[(symbol=? 'HowAreYou 'GoodMorning) 'Fine]
[(symbol=? 'GoodAfternoon 'GoodMorning) 'NeedANap]
[(symbol=? 'GoodEvening 'GoodMorning) 'BoyAmITired])
= (cond
[true 'Hi]
[(symbol=? 'HowAreYou 'GoodMorning) 'Fine]
[(symbol=? 'GoodAfternoon 'GoodMorning) 'NeedANap]
[(symbol=? 'GoodEvening 'GoodMorning) 'BoyAmITired]) =
'Hi
これは,
(cond
[(symbol=? 'GoodMorning s) 'Hi]
[(symbol=? 'HowAreYou s) 'Fine]
[(symbol=? 'GoodAfternoon s) 'NeedANap]
[(symbol=? 'GoodEvening s) 'BoyAmITired])
s'GoodMorning で置き換えたもの
(reply 'GoodMorning) から 'Hi が得られる過程
80
5-6 課題
81
実行結果を報告しなさい
DrScheme の実行用インド」で実行して,
実行結果を報告しなさい
「エラー」が出た場合には,「エラー」と記入
すること
(list 1) (list 1 2) (list 1 2 3)
(first (list ...))
の実行結果
(rest (list ...))
の実行結果
(first (rest
(list ...))) の実
行結果
(first (rest
(rest(list ...)))
) の実行結果
課題1
82
最高気温 high と最低気温 low から,真夏日,
夏日,冬日,真冬日を判定する関数 summer-
winter-day を作成し,実行結果を報告しなさ
"Tropical Day"
(真夏日,1日の最高気温が30度以上の日)
"Summer Day"
(夏日,1日の最高気温が25度以上の日)
"Frost Day"
(冬日,1日の最低気温が0度未満の日)
"Ice Day"
(真冬日,1日の最高気温が0度未満の日)
課題2
83
ある年 yのある月 m のある日 d
存在するかを調べ,存在すれば d
を,存在しなければシンボル「'*
を返す関数を作成し,実行結果を
報告しなさい
例えば,
2004 10 10 10 を出力
2004 10 0 '* を出力
2004 10 32 '* を出力
課題3
84