Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 5,327 views

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

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

Statistics

Views

Total Views
5,327
Views on SlideShare
5,147
Embed Views
180

Actions

Likes
1
Downloads
12
Comments
0

7 Embeds 180

http://mixslide.com 161
https://twitter.com 10
http://twitter.com 5
http://www.onlydoo.com 1
http://paper.li 1
http://nuevospowerpoints.blogspot.com 1
http://www.linkedin.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

  • Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜 プログラミングコース 言語組 宇佐美 健太
  • やりたいこと Rubyに新しい文法を追加したい  後置のcase文(修飾子)  改行をハッシュの区切り記号に!
  • 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”); }
  • 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
  • Rubyに後置case文を追加 後置case whenを追加したい!  どうやるの? パーサを編集して、Rubyに新たな規則を追加! Rubyは構文解析にYaccを使用  ”Yet Another Compiler-Compiler”  字句解析されてきたコードを parse.y (yaccファイル) を編集  既存の規則と衝突しないように追加
  • 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”)
  • 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 }
  • 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
  • #既存の構文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 then ... else s.to_yaml end#syntax error, unexpected n, expecting keyword_when#なにそれ読めない! Rubyでおk
  • ハッシュの,を省略 Rubyのハッシュ settings={ ”userid” =>”myuser” , ”passwd” =>”PassWord” , ”host” =>”127.0.0.1” } puts(settings[”userid”]) #=>”myuser” puts settings[”passwd”] #=>”PassWord” 各行末に , を書く必要があって、ちょっとめんどい! だから区切りの , を省略したい!
  • ハッシュの , を省略 つまりこう書きたい hash={ ”key” => ”kanon” ”key2” => ”air” ”chao” => ”leaf” } key={ 1999=>"Kanon",2000=>"AIR" 2004=>"CLANNAD",2007=>"Little Busters!" } いちいち行末に , を書かなくても良いので、 見ためが非常にすっきりして書きやすい!
  • ハッシュの , を省略 結果 => できました。  ハッシュの区切り ( , ) を ( , n) にしただけ! n  メソッドの引数や配列の区切りと兼用だったので、ハッ シュだけを隔離。  メソッドに渡す引数も改行で区切りできると便利なのだ けれど、今回のところは断念。  Rubyはメソッド呼び出しの括弧は省略がデフォなので、 これに対応しようとするとカオス!Leaf = Hash[ 1997=>"ToHeart",1998=>"WHITE ALBUM" 1999=>"Comic Party",2004=>"ToHeart2"] # {}に似てるけど、Hash#[]はメソッド呼びだし {} []
  • 今回の成果 case文を後置(修飾子)にできることが確認できた ハッシュの初期化時に , のほかに改行でも 区切ることができるようになった 現状ではテストが未完了だが、できればそのうち 正式にコミットしたい 課題  case文は既存の構文と衝突するので解決が必要  ハッシュは特に問題ないのではないか (未確認)