Successfully reported this slideshow.

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

1

Share

Upcoming SlideShare
詳説ぺちぺち
詳説ぺちぺち
Loading in …3
×
1 of 14
1 of 14

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

1

Share

Download to read offline

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

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

More Related Content

Related Books

Free with a 14 day trial from Scribd

See all

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 = 3 puts "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 = true case t when true then puts”ok” end #=>”ok” #干渉しない!
  10. 10. Rubyに後置case文を追加 #既存の構文 def say arg;p arg;end say 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文は既存の構文と衝突するので解決が必要  ハッシュは特に問題ないのではないか (未確認)

×