Download - Gura プログラミング言語の紹介
Copyright (C) 2014 ypsitau 2/49
自己紹介
名前 斉藤 寛 (ゆたか)
開発経験 組込ファームウェア から GUI まで
職歴 電機メーカ・米半導体メーカ・ベンチャ
現職 フリー というか無職
使用言語 C++, Gura
Gura 開発に専念中
Copyright (C) 2014 ypsitau 3/49
拡張モジュール
イテレータ処理
基本的な仕様
Guraとはなにか
Agenda
Guraとはなにか
Copyright (C) 2014 ypsitau 4/49
Guraとはなにか
プログラム中で頻繁に出てくる 繰返し処理
for (i = 0; i < 10; i++) {}
people.each do |person|end
for x in range(10):hoge
冗長な制御構文なしで処理できないか?
Copyright (C) 2014 ypsitau 5/49
ケーススタディ (1)
数値列 -3, -2, -1, 0, 1, 2, 3 があります。二乗した値を求めてリストにしてください
あなたの好きな言語で考えて …
x
y
Copyright (C) 2014 ypsitau 6/49
Gura ならこう書く (1)
x = [-3, -2, -1, 0, 1, 2, 3]y = x * x
Copyright (C) 2014 ypsitau 7/49
Gura ならこう書く (1)
x = [-3, -2, -1, 0, 1, 2, 3]y = x * x
要素をかけ算するイテレータ生成イテレータ
イテレータを評価してリスト生成
イテレータ イテレータ リストからイテレータ生成1
2
3評価
リスト リスト
リスト
Copyright (C) 2014 ypsitau 8/49
ケーススタディ (2)
テキストファイルを読み込み、行番号つきで画面に表示するプログラムをつくってください
Think it with yourfavorite language …
1: #include <std2: int main()3: {4: printf(“H5: }
Copyright (C) 2014 ypsitau 9/49
Gura ならこう書く (2)
printf('%d: %s',1.., readlines('hello.c'))
Copyright (C) 2014 ypsitau 10/49
Gura ならこう書く (2)
printf('%d: %s',1.., readlines('hello.c'))
イテレータ イテレータ
イテレータ 要素ごとに関数 printf を実行するイテレータ生成
イテレータを評価した後、破棄
1
評価2
Copyright (C) 2014 ypsitau 11/49
つまり Gura とは
イテレータ
イテレータイテレータ
イテレータ
イテレータイテレータ
イテレータ
評価
イテレータから新たなイテレータを生成し、演算・評価できる言語
Guraにおいて、この操作を「マッピング」と呼ぶ
Copyright (C) 2014 ypsitau 12/49
期待できること
繰り返し処理を簡潔に書ける
並列処理が容易になる かも
1
2
Copyright (C) 2014 ypsitau 13/49
並列処理のアイデア
イテレータ
イテレータイテレータ
イテレータ
イテレータイテレータ
イテレータ
評価
最終的に生成したイテレータの要素
イテレータ生成の負荷は軽い
負荷が重いのは評価の段階
処理系に要素を分配して評価 評価 評価 評価
Copyright (C) 2014 ypsitau 14/49
拡張モジュール
イテレータ処理
基本的な仕様
Guraとはなにか
Agenda
基本的な仕様
Copyright (C) 2014 ypsitau 15/49
基本的な仕様
関数
制御構文
オブジェクト指向
コレクション
スコープ管理
Copyright (C) 2014 ypsitau 16/49
基本的な仕様(1) 関数
x = f(a => 3, b => 4)
f(a:number, b:number) = {a * a + b * b
}
x = f(3, 4)
関数定義 (1)
呼出し例
引数の型を指定できる
名前つき引数指定
Copyright (C) 2014 ypsitau 17/49
基本的な仕様(1) 関数
f(3) // a=3, b=[]f(3, 1) // a=3, b=[1]f(3, 1, 4, 1) // a=3, b=[1,4,1]
f(a, b*) = {// any job
}
呼出し例
関数定義 (2) 0 個以上の値をとる可変長引数b+ なら 1 個以上の指定になる
Copyright (C) 2014 ypsitau 18/49
基本的な仕様(1) 関数
my_loop(n) {block} = {while (n > 0) {
block()n -= 1
}}
my_loop(3) {println('hello')
}
関数定義 (3)
呼出し例
ブロック式を関数オブジェクトで受取る{block?} ならオプショナルなブロック
Copyright (C) 2014 ypsitau 19/49
基本的な仕様(2) 制御構文
if (…) {
} elsif (…) {
} elsif (…) {
} else {
}
try {
} catch (…) {
} catch (…) {
}
for (…) {
}
repeat (…) {
}
while (…) {
}
繰返し処理 条件分岐 例外処理
cross (…) {
}
Copyright (C) 2014 ypsitau 20/49
基本的な仕様(3) オブジェクト指向
Fruit = class {__init__(name:string, price:number) = {
this.name = namethis.price = price
}Print() = {
printf('%s %d\n', this.name, this.price)}
}
fruit = Fruit('Orange', 90)fruit.Print()
クラス定義
インスタンス生成・メソッド呼出し
コンストラクタ
Copyright (C) 2014 ypsitau 21/49
基本的な仕様(3) オブジェクト指向
A = class {__init__(x, y) = {
// any jobs}
}
B = class(A) {__init__(x, y, z) = {|x, y|
// any jobs}
}
継承
ベースクラスコンストラクタへの引数
Copyright (C) 2014 ypsitau 22/49
基本的な仕様(4) コレクション
a = [3, 1, 4, 1, 5, 9]b = ['zero', 'one', 2, 3, 'four', 5]
c = %{ `a => 3, `b => 1, `c => 4 }d = %{
'いぬ' => 'dog', 'ねこ' => 'cat'}
リスト
辞書
Copyright (C) 2014 ypsitau 23/49
基本的な仕様(5) スコープ管理
create_counter(n:number) = {function {
n -= 1}
}
c = create_counter(4)c() // returns 3c() // returns 2c() // returns 1
クロージャ
関数内はレキシカルスコープ
Copyright (C) 2014 ypsitau 24/49
拡張モジュール
イテレータ処理
基本的な仕様
Guraとはなにか
Agenda
イテレータ処理
Copyright (C) 2014 ypsitau 25/49
イテレータ処理
暗黙的マッピング
メンバマッピング
関数繰返し制御構文
マッピング
生成
イテレータ
イテレータイテレータ
イテレータ
イテレータ
イテレータ処理: マッピングと生成
Copyright (C) 2014 ypsitau 26/49
Gura における リストとイテレータリスト
イテレータ
['apple', 'orange', 'grape']
('apple', 'orange', 'grape')
要素がすべてメモリ上に用意されている
要素をひとつずつ生成する
ランダムアクセスが可能
評価しないと次の要素は分からない
Copyright (C) 2014 ypsitau 27/49
Gura における リストとイテレータ
イテレータ
リスト 評価
生成
Copyright (C) 2014 ypsitau 28/49
イテレータ処理(1) 暗黙的マッピング
関数または演算子操作を行うイテレータを生成
イテレータ
イテレータ
イテレータ
イテレータ
関数or
演算子
引数 戻り値
暗黙的マッピング
Copyright (C) 2014 ypsitau 29/49
イテレータ処理(1) 暗黙的マッピング
f(a:number, b:number) = {a * b
}
普通の関数
f(a:number, b:number):map = {a * b
}
マッピング対応関数 アトリビュート :map をつける
Copyright (C) 2014 ypsitau 30/49
イテレータ処理(1) 暗黙的マッピング
f(3, 4)数値答: 12
f([2, 3, 4], [3, 4, 5])リスト答: [6, 12, 20]
f((2, 3, 4), (3, 4, 5))イテレータ答: (6, 12, 20)
f(5, (3, 4, 5))数値とイテレータ
答: (15, 20, 25)
Copyright (C) 2014 ypsitau 31/49
イテレータ処理(1) 暗黙的マッピング
リスト
スカラー
イテレータ
リスト
イテレータ・リスト以外
マッピング適用は引数のデータ型によって異なる
イテレータデータ型を大別
マッピング適用 3 つのルール
Copyright (C) 2014 ypsitau 32/49
イテレータ処理(1) 暗黙的マッピング
リスト
スカラー
イテレータ
イテレータイテレータ
引数にイテレータがあればイテレータを生成
イテレータイテレータ
イテレータイテレータ
ルール 1
Copyright (C) 2014 ypsitau 33/49
イテレータ処理(1) 暗黙的マッピング
リスト
引数にイテレータがなく、リストがあればリストを生成
リスト
リスト
スカラー
リスト
リスト
ルール 2
Copyright (C) 2014 ypsitau 34/49
イテレータ処理(1) 暗黙的マッピング
引数にスカラーのみがあればスカラーを生成
スカラー
スカラースカラー
ルール 3
Copyright (C) 2014 ypsitau 35/49
イテレータ処理(2) メンバマッピング
メンバマッピング
fruits[0] fruits[1] fruits[2]
name name name
Print() Print() Print()
price price price
インスタンスのリスト
メンバアクセスをするイテレータを生成する機能
Copyright (C) 2014 ypsitau 36/49
イテレータ処理(2) メンバマッピング
メンバマッピング
fruits[0] fruits[1] fruits[2]
name name name
Print() Print() Print()
price price price
イテレータ
メンバアクセスをするイテレータを生成する機能
fruits:*name
fruits:*price
fruits:*Print()
インスタンスのリスト
Copyright (C) 2014 ypsitau 37/49
イテレータ処理(2) メンバマッピング
sum = 0for (fruit in fruits) {
sum += fruit.price}println(sum)
println(fruits:*price.sum())
Fruit インスタンスのメンバ price の合計を表示する例題
解法1
解法2
繰返し構文を使う
メンバマッピングを使う
Copyright (C) 2014 ypsitau 38/49
イテレータ処理(3) 関数
イテレータ関数 関数がデータ列を返す場合はリストではなくイテレータで返す
rtn = readlines('hello.c')
rtn = range(10)
行ごとの文字列を返すイテレータ
0 から 9 までの数値を返すイテレータ
設計ポリシー
Copyright (C) 2014 ypsitau 39/49
イテレータ処理(3) 関数
イテレータ関数
rtn = readlines('hello.c'):list
rtn = range(10):list
行ごとの文字列を含むリスト
0 から 9 までの数値を含むリスト
リストリストがほしいときはアトリビュート :list をつけて呼び出し
Copyright (C) 2014 ypsitau 40/49
イテレータ処理(4) 繰返し制御構文
繰返し制御構文からイテレータを生成イテレータ
繰返し制御構文
生成値
繰返し処理
x = for (…):iter {
}
繰返し処理の評価値がイテレータの要素値になる
アトリビュート :iter をつける
for
repeat
while
cross
Copyright (C) 2014 ypsitau 41/49
イテレータ処理(4) 制御構文イテレータ
n = 0x = for (i in 0..5):iter {
n += i}
この時点では何も実行しない
println(x)
結果を表示: 0 1 3 6 10 15
制御構文イテレータの使用例
Copyright (C) 2014 ypsitau 42/49
イテレータ処理(4) 制御構文イテレータ
prime() = {p = []for (n in 2..):xiter {
if (!(n % p.each() == 0).or()) {p.add(n)n
}}
}
primes = prime()
素数(2, 3, 5, 7..)を返すイテレータ
素数を生成するイテレータ
Copyright (C) 2014 ypsitau 43/49
拡張モジュール
イテレータ処理
基本的な仕様
Guraとはなにか
Agenda
拡張モジュール
Copyright (C) 2014 ypsitau 44/49
拡張モジュール
設計ポリシー
Gura インタープリタ本体は OS 特有の機能やライブラリにできるだけ依存しないモジュールを import して機能拡張する
Guraインタープリタ
モジュールモジュールモジュール
モジュールモジュールモジュール
Copyright (C) 2014 ypsitau 45/49
おもなモジュール
GUIwxWidgets Tk SDL
グラフィック描画Cairo OpenGL FreeType
イメージデータJPEG PNG GIF BMP
ICO XPM PPM TIFF
ネットワークcURL サーバ機能
テキスト処理
正規表現yamlXMLCSV
markdown
アーカイブ・圧縮TAR ZIP GZIP BZIP
Copyright (C) 2014 ypsitau 46/49
モジュール間連携
Gura インタープリタ
JPEG PNG GIF BMP ICO XPM PPM TIFF
Cairo OpenGL FreeType wxWidgets Tk SDL
image
グラフィック描画ディスプレイ出力
イメージデータ読み書き
Copyright (C) 2014 ypsitau 47/49
こういうアプリができます「おうちで証明写真 Gura Shot」
デジカメ画像から顔を抽出して証明写真を作成結果を PDF や JPEG で出力
JPEG image Cairo image JPEG
wxWidgets
ファイル読込み 画像構成 ファイル書き込み
ディスプレイ出力
Copyright (C) 2014 ypsitau 48/49
ありがとうございました
www.gura-lang.org