Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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,676 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文は既存の構文と衝突するので解決が必要  ハッシュは特に問題ないのではないか (未確認)

×