スライド 1

言語組・課題
≪Ruby の構文拡張≫
Goal
• (Ruby の) 構文解析の仕組みを知ろう!!
• Ruby を改造して新しい構文を作れるくらい
詳しくなろう!!
こんなの作ってみるとどうでしょう?
1: カンマの省略
• http://www.atdot.net/~ko1/diary/201007.html#d20
– 「Ruby で設定ファイルを書かせる 」
– 「でも,Ruby の Hash リテラルは,
カンマを要求するので書きづらそうな気がする」
setting = {
a: 1,
b: 2,
c: 3
}
setting
a:
b:
c:
}
= {
1
2
3
baz(
a: 1
b: 2
c: {x: 1
y: 2
z: 3} )
2: 後置 case ~ when
• Ruby は、if や while などを後ろに書ける
if x==“hello”
puts “world”
end
puts “world” if x==“hello”
• case 文もできると便利では!?
case obj
when 100, 200
puts “ok!”
end
puts “ok!” case obj when 100, 200
3: 1行関数略記法
• 関数の中身が1文で済む時の略記法
– (参照: Scala 等)
def f(x,y)
x*x + y*y
end
def f(x,y) = x*x + y*y
def f(x,y); x*x + y*y; end
4: ハッシュの分割代入
• (参照: JavaScript 等)
x = myHash[:foo]
y = myHash[:bar]
myHash = {foo: 1, bar: 2}
{foo:x, bar:y} = myHash
5: マルチバイト演算子
• 「×」 や 「÷」 を使えるRuby!
puts
3×8÷2
• もっと一般的に?
infix waru
8 waru 2 # => 8.waru(2)
6: パターンマッチ
• (参照: Haskell, ML, Scala 等)
case str
when /^(.)$/;
when /^(.)(.)$/;
when /^a(..)z$/;
end
match arr
when [x];
when [x,y];
when [10,x,y,20];
when [[*_],*_];
end
puts “1文字: #{$1}”
puts “2文字: #{$1} #{$2}”
puts “aで始まりzで終わる4文字”
puts
puts
puts
puts
“1文字: #{x}“
“2文字: #{x} #{y}“
“10で始まり20で終わる4要素”
“先頭が配列”
7: その他
おもしろそうな構文を
思いついたら
なんでもどうぞ