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

More Related Content

Gura プログラミング言語の紹介