Rubyにおける構文追加の試み    〜ボクとRubyと俺々文法〜             プログラミングコース                    言語組                 宇佐美 健太
やりたいこと   Rubyに新しい文法を追加したい       後置のcase文(修飾子)       改行をハッシュの区切り記号に!
Rubyに後置case文を追加   Rubyのcase文はCのswitchに相当             C                   Ruby    switch(var){    switch                 c...
Rubyに後置case文を追加   修飾子による制御    a=0,x=100,y=false    puts ”#{a=a+1}” while a<10    puts ”x=#{x}” if x==100    puts ”y=#{y}”...
Rubyに後置case文を追加   後置case whenを追加したい!       どうやるの?      パーサを編集して、Rubyに新たな規則を追加!   Rubyは構文解析にYaccを使用       ”Yet Another ...
Rubyに後置case文を追加var = 3puts "Hello" case var when (1..5)            NODE_CASE                                  構文木NODE_DVAR...
Rubyに後置case文を追加   yacc文法規則    primary:k_case expr_value opt_terms            case_body            k_end            {     ...
Rubyに後置case文を追加   新しい文法規則を追加した結果    #追加した構文    puts”ok” case gets() when x,y,z    #既存の構文    g = gets    puts”ok” if g==x|...
#既存の構文t = truecase t when true then puts”ok” end                           #=>”ok”                           #干渉しない!
Rubyに後置case文を追加#既存の構文def say arg;p arg;endsay case option            when :ruby then s.to_ruby            when :marshal th...
ハッシュの,を省略   Rubyのハッシュ    settings={          ”userid” =>”myuser”   ,          ”passwd” =>”PassWord” ,          ”host” =>”...
ハッシュの , を省略   つまりこう書きたい    hash={             ”key” => ”kanon”             ”key2” => ”air”             ”chao” => ”leaf”  ...
ハッシュの , を省略   結果 => できました。       ハッシュの区切り ( , ) を ( , n) にしただけ!                              n       メソッドの引数や配列の区切りと兼用だ...
今回の成果   case文を後置(修飾子)にできることが確認できた   ハッシュの初期化時に , のほかに改行でも    区切ることができるようになった   現状ではテストが未完了だが、できればそのうち    正式にコミットしたい   ...
Upcoming SlideShare
Loading in …5
×

Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜

5,437 views

Published on

セキュリティ&プログラミングキャンプ2010のプログラミングコース言語組でおこなった成果発表のスライド。

Published in: Technology, Education
  • Be the first to comment

Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜

  1. 1. Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜 プログラミングコース 言語組 宇佐美 健太
  2. 2. やりたいこと Rubyに新しい文法を追加したい  後置のcase文(修飾子)  改行をハッシュの区切り記号に!
  3. 3. Rubyに後置case文を追加 Rubyのcase文はCのswitchに相当 C Ruby switch(var){ switch case var case 1: when 1 then puts(”case 1”); puts ”case 1” break; when 2 then case 2: puts ”case 2” puts(”case 2”); else break; puts ”default” default: default end puts(”default”); }
  4. 4. Rubyに後置case文を追加 修飾子による制御 a=0,x=100,y=false puts ”#{a=a+1}” while a<10 puts ”x=#{x}” if x==100 puts ”y=#{y}” unless y z=(1/0) rescue puts ”zero div!” ここにcase文も追加したい! N=10, m=false puts ”Hello” case n when (1..20) puts ”Welcome” case when m
  5. 5. Rubyに後置case文を追加 後置case whenを追加したい!  どうやるの? パーサを編集して、Rubyに新たな規則を追加! Rubyは構文解析にYaccを使用  ”Yet Another Compiler-Compiler”  字句解析されてきたコードを parse.y (yaccファイル) を編集  既存の規則と衝突しないように追加
  6. 6. Rubyに後置case文を追加var = 3puts "Hello" case var when (1..5) NODE_CASE 構文木NODE_DVAR var NODE_WHEN NODE_ARRAY NODE_FCALL (1..5) puts(“Hello”)
  7. 7. Rubyに後置case文を追加 yacc文法規則 primary:k_case expr_value opt_terms case_body k_end { $$ = NEW_CASE($2, $4); $2 $4 } primary: stmt modifier_case expr_value keyword_when args { $$=NEW_CASE($3,NEW_WHEN($5,$1,0)); $3 $5 $1 }
  8. 8. Rubyに後置case文を追加 新しい文法規則を追加した結果 #追加した構文 puts”ok” case gets() when x,y,z #既存の構文 g = gets puts”ok” if g==x||g==y||g==z case gets when x,y,z puts ”ok” end
  9. 9. #既存の構文t = truecase t when true then puts”ok” end #=>”ok” #干渉しない!
  10. 10. Rubyに後置case文を追加#既存の構文def say arg;p arg;endsay case option when :ruby then s.to_ruby when :marshal then ... else s.to_yaml end#syntax error, unexpected n, expecting keyword_when#なにそれ読めない! Rubyでおk
  11. 11. ハッシュの,を省略 Rubyのハッシュ settings={ ”userid” =>”myuser” , ”passwd” =>”PassWord” , ”host” =>”127.0.0.1” } puts(settings[”userid”]) #=>”myuser” puts settings[”passwd”] #=>”PassWord” 各行末に , を書く必要があって、ちょっとめんどい! だから区切りの , を省略したい!
  12. 12. ハッシュの , を省略 つまりこう書きたい hash={ ”key” => ”kanon” ”key2” => ”air” ”chao” => ”leaf” } key={ 1999=>"Kanon",2000=>"AIR" 2004=>"CLANNAD",2007=>"Little Busters!" } いちいち行末に , を書かなくても良いので、 見ためが非常にすっきりして書きやすい!
  13. 13. ハッシュの , を省略 結果 => できました。  ハッシュの区切り ( , ) を ( , n) にしただけ! n  メソッドの引数や配列の区切りと兼用だったので、ハッ シュだけを隔離。  メソッドに渡す引数も改行で区切りできると便利なのだ けれど、今回のところは断念。  Rubyはメソッド呼び出しの括弧は省略がデフォなので、 これに対応しようとするとカオス!Leaf = Hash[ 1997=>"ToHeart",1998=>"WHITE ALBUM" 1999=>"Comic Party",2004=>"ToHeart2"] # {}に似てるけど、Hash#[]はメソッド呼びだし {} []
  14. 14. 今回の成果 case文を後置(修飾子)にできることが確認できた ハッシュの初期化時に , のほかに改行でも 区切ることができるようになった 現状ではテストが未完了だが、できればそのうち 正式にコミットしたい 課題  case文は既存の構文と衝突するので解決が必要  ハッシュは特に問題ないのではないか (未確認)

×