SlideShare a Scribd company logo
1 of 14
Download to read offline
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 = 3
puts "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 = true
case t when true then puts”ok” end
                           #=>”ok”
                           #干渉しない!
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
ハッシュの,を省略

   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文は既存の構文と衝突するので解決が必要
       ハッシュは特に問題ないのではないか (未確認)

More Related Content

What's hot

Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Ransui Iso
 
すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪yashigani
 
Lisp batton - Common LISP
Lisp batton - Common LISPLisp batton - Common LISP
Lisp batton - Common LISPMasaomi CHIBA
 
Write good parser in perl
Write good parser in perlWrite good parser in perl
Write good parser in perlJiro Nishiguchi
 
すごいConstたのしく使おう!
すごいConstたのしく使おう!すごいConstたのしく使おう!
すごいConstたのしく使おう!Akihiro Nishimura
 
WordPress のための PHP 超入門
WordPress のための PHP 超入門WordPress のための PHP 超入門
WordPress のための PHP 超入門Michinari Odajima
 
Patterns and Matching in Rust
Patterns and Matching in RustPatterns and Matching in Rust
Patterns and Matching in RustDaichiMukai1
 
Goの文法の実例と解説
Goの文法の実例と解説Goの文法の実例と解説
Goの文法の実例と解説Ryuji Iwata
 
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門kwatch
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかYuki Miyatake
 
Elixir macro-in-action-1
Elixir macro-in-action-1Elixir macro-in-action-1
Elixir macro-in-action-1k1complete
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
Openjdk 入門してみた話
Openjdk 入門してみた話Openjdk 入門してみた話
Openjdk 入門してみた話Tokuhiro Matsuno
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRubyemasaka
 
初級者向けレッスン 51回 ─── 例外
初級者向けレッスン 51回 ─── 例外初級者向けレッスン 51回 ─── 例外
初級者向けレッスン 51回 ─── 例外higaki
 

What's hot (19)

Perl勉強会#2資料
Perl勉強会#2資料Perl勉強会#2資料
Perl勉強会#2資料
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
Project coin
Project coinProject coin
Project coin
 
すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪
 
Lisp batton - Common LISP
Lisp batton - Common LISPLisp batton - Common LISP
Lisp batton - Common LISP
 
Write good parser in perl
Write good parser in perlWrite good parser in perl
Write good parser in perl
 
すごいConstたのしく使おう!
すごいConstたのしく使おう!すごいConstたのしく使おう!
すごいConstたのしく使おう!
 
WordPress のための PHP 超入門
WordPress のための PHP 超入門WordPress のための PHP 超入門
WordPress のための PHP 超入門
 
Patterns and Matching in Rust
Patterns and Matching in RustPatterns and Matching in Rust
Patterns and Matching in Rust
 
Goの文法の実例と解説
Goの文法の実例と解説Goの文法の実例と解説
Goの文法の実例と解説
 
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
Elixir macro-in-action-1
Elixir macro-in-action-1Elixir macro-in-action-1
Elixir macro-in-action-1
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
Openjdk 入門してみた話
Openjdk 入門してみた話Openjdk 入門してみた話
Openjdk 入門してみた話
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRuby
 
Map
MapMap
Map
 
初級者向けレッスン 51回 ─── 例外
初級者向けレッスン 51回 ─── 例外初級者向けレッスン 51回 ─── 例外
初級者向けレッスン 51回 ─── 例外
 

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

Rails基礎講座 part.1
Rails基礎講座 part.1Rails基礎講座 part.1
Rails基礎講座 part.1Jun Yokoyama
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタートShumpei Shiraishi
 
2017年夏のPerl
2017年夏のPerl2017年夏のPerl
2017年夏のPerlcharsbar
 
Ruby 同好会宣言
Ruby 同好会宣言Ruby 同好会宣言
Ruby 同好会宣言Yuya Takeyama
 
Perlで伝統芸能
Perlで伝統芸能Perlで伝統芸能
Perlで伝統芸能hitode909
 
Ruby初級者向けレッスン 54回 ─── クラス
Ruby初級者向けレッスン 54回 ─── クラスRuby初級者向けレッスン 54回 ─── クラス
Ruby初級者向けレッスン 54回 ─── クラスhigaki
 
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようCookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようKoichi Sasada
 
ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章Yuta Yokoi
 
ScalaプログラマのためのHaskell入門
ScalaプログラマのためのHaskell入門ScalaプログラマのためのHaskell入門
ScalaプログラマのためのHaskell入門Yasuaki Takebe
 
プログラミングHaskell(第1章)
プログラミングHaskell(第1章)プログラミングHaskell(第1章)
プログラミングHaskell(第1章)yaju88
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScriptAshitaba YOSHIOKA
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdfHiroshi Ono
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdfHiroshi Ono
 
Material
MaterialMaterial
Material_TUNE_
 

Similar to Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜 (15)

Rails基礎講座 part.1
Rails基礎講座 part.1Rails基礎講座 part.1
Rails基礎講座 part.1
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
 
2017年夏のPerl
2017年夏のPerl2017年夏のPerl
2017年夏のPerl
 
Ruby 同好会宣言
Ruby 同好会宣言Ruby 同好会宣言
Ruby 同好会宣言
 
Perlで伝統芸能
Perlで伝統芸能Perlで伝統芸能
Perlで伝統芸能
 
Ruby初級者向けレッスン 54回 ─── クラス
Ruby初級者向けレッスン 54回 ─── クラスRuby初級者向けレッスン 54回 ─── クラス
Ruby初級者向けレッスン 54回 ─── クラス
 
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようCookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
 
ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章
 
ScalaプログラマのためのHaskell入門
ScalaプログラマのためのHaskell入門ScalaプログラマのためのHaskell入門
ScalaプログラマのためのHaskell入門
 
プログラミングHaskell(第1章)
プログラミングHaskell(第1章)プログラミングHaskell(第1章)
プログラミングHaskell(第1章)
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScript
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
Material
MaterialMaterial
Material
 
Rake
RakeRake
Rake
 

More from Kenta USAMI

5分でわかる静的解析入門
5分でわかる静的解析入門5分でわかる静的解析入門
5分でわかる静的解析入門Kenta USAMI
 
なんとかStormに負けたくないEmacs初級篇
なんとかStormに負けたくないEmacs初級篇なんとかStormに負けたくないEmacs初級篇
なんとかStormに負けたくないEmacs初級篇Kenta USAMI
 
たのしい独自フレームワーク
たのしい独自フレームワークたのしい独自フレームワーク
たのしい独自フレームワークKenta USAMI
 
Real World PHP in pixiv
Real World PHP in pixivReal World PHP in pixiv
Real World PHP in pixivKenta USAMI
 
人類の役に立たないDSL、そしていつからRubyが最高の言語だと錯覚してた? with PHP
人類の役に立たないDSL、そしていつからRubyが最高の言語だと錯覚してた? with PHP人類の役に立たないDSL、そしていつからRubyが最高の言語だと錯覚してた? with PHP
人類の役に立たないDSL、そしていつからRubyが最高の言語だと錯覚してた? with PHPKenta USAMI
 
はじめてのUser-Agent文字列
はじめてのUser-Agent文字列はじめてのUser-Agent文字列
はじめてのUser-Agent文字列Kenta USAMI
 
pixivとl10n/i18n
pixivとl10n/i18npixivとl10n/i18n
pixivとl10n/i18nKenta USAMI
 
Rubicureに学ぶメタプログラミング
Rubicureに学ぶメタプログラミングRubicureに学ぶメタプログラミング
Rubicureに学ぶメタプログラミングKenta USAMI
 
これからの名前の話をしよう
これからの名前の話をしようこれからの名前の話をしよう
これからの名前の話をしようKenta USAMI
 
近況の報告と自宅警備員が失職した話
近況の報告と自宅警備員が失職した話近況の報告と自宅警備員が失職した話
近況の報告と自宅警備員が失職した話Kenta USAMI
 
学ばないDSL
学ばないDSL学ばないDSL
学ばないDSLKenta USAMI
 
札幌F#勉強会とは何だったのか
札幌F#勉強会とは何だったのか札幌F#勉強会とは何だったのか
札幌F#勉強会とは何だったのかKenta USAMI
 
tadsanとは誰か
tadsanとは誰かtadsanとは誰か
tadsanとは誰かKenta USAMI
 
DTの異常な愛情 または私は如何にして心配するのを止めてWILLCOMを愛するようになったか
DTの異常な愛情 または私は如何にして心配するのを止めてWILLCOMを愛するようになったかDTの異常な愛情 または私は如何にして心配するのを止めてWILLCOMを愛するようになったか
DTの異常な愛情 または私は如何にして心配するのを止めてWILLCOMを愛するようになったかKenta USAMI
 
PowerShell+Lisp = ? (第2回残パン会)
PowerShell+Lisp = ? (第2回残パン会)PowerShell+Lisp = ? (第2回残パン会)
PowerShell+Lisp = ? (第2回残パン会)Kenta USAMI
 
キャンプ後の生活の変化とモチベーションの変化について
キャンプ後の生活の変化とモチベーションの変化についてキャンプ後の生活の変化とモチベーションの変化について
キャンプ後の生活の変化とモチベーションの変化についてKenta USAMI
 
関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』Kenta USAMI
 
After Camp 2011『今日から始める函数型プログラミング』(内容無し)
After Camp 2011『今日から始める函数型プログラミング』(内容無し)After Camp 2011『今日から始める函数型プログラミング』(内容無し)
After Camp 2011『今日から始める函数型プログラミング』(内容無し)Kenta USAMI
 

More from Kenta USAMI (20)

5分でわかる静的解析入門
5分でわかる静的解析入門5分でわかる静的解析入門
5分でわかる静的解析入門
 
なんとかStormに負けたくないEmacs初級篇
なんとかStormに負けたくないEmacs初級篇なんとかStormに負けたくないEmacs初級篇
なんとかStormに負けたくないEmacs初級篇
 
たのしい独自フレームワーク
たのしい独自フレームワークたのしい独自フレームワーク
たのしい独自フレームワーク
 
Real World PHP in pixiv
Real World PHP in pixivReal World PHP in pixiv
Real World PHP in pixiv
 
人類の役に立たないDSL、そしていつからRubyが最高の言語だと錯覚してた? with PHP
人類の役に立たないDSL、そしていつからRubyが最高の言語だと錯覚してた? with PHP人類の役に立たないDSL、そしていつからRubyが最高の言語だと錯覚してた? with PHP
人類の役に立たないDSL、そしていつからRubyが最高の言語だと錯覚してた? with PHP
 
はじめてのUser-Agent文字列
はじめてのUser-Agent文字列はじめてのUser-Agent文字列
はじめてのUser-Agent文字列
 
pixivとl10n/i18n
pixivとl10n/i18npixivとl10n/i18n
pixivとl10n/i18n
 
Rubicureに学ぶメタプログラミング
Rubicureに学ぶメタプログラミングRubicureに学ぶメタプログラミング
Rubicureに学ぶメタプログラミング
 
Accept-language
Accept-languageAccept-language
Accept-language
 
php.js
php.jsphp.js
php.js
 
これからの名前の話をしよう
これからの名前の話をしようこれからの名前の話をしよう
これからの名前の話をしよう
 
近況の報告と自宅警備員が失職した話
近況の報告と自宅警備員が失職した話近況の報告と自宅警備員が失職した話
近況の報告と自宅警備員が失職した話
 
学ばないDSL
学ばないDSL学ばないDSL
学ばないDSL
 
札幌F#勉強会とは何だったのか
札幌F#勉強会とは何だったのか札幌F#勉強会とは何だったのか
札幌F#勉強会とは何だったのか
 
tadsanとは誰か
tadsanとは誰かtadsanとは誰か
tadsanとは誰か
 
DTの異常な愛情 または私は如何にして心配するのを止めてWILLCOMを愛するようになったか
DTの異常な愛情 または私は如何にして心配するのを止めてWILLCOMを愛するようになったかDTの異常な愛情 または私は如何にして心配するのを止めてWILLCOMを愛するようになったか
DTの異常な愛情 または私は如何にして心配するのを止めてWILLCOMを愛するようになったか
 
PowerShell+Lisp = ? (第2回残パン会)
PowerShell+Lisp = ? (第2回残パン会)PowerShell+Lisp = ? (第2回残パン会)
PowerShell+Lisp = ? (第2回残パン会)
 
キャンプ後の生活の変化とモチベーションの変化について
キャンプ後の生活の変化とモチベーションの変化についてキャンプ後の生活の変化とモチベーションの変化について
キャンプ後の生活の変化とモチベーションの変化について
 
関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』
 
After Camp 2011『今日から始める函数型プログラミング』(内容無し)
After Camp 2011『今日から始める函数型プログラミング』(内容無し)After Camp 2011『今日から始める函数型プログラミング』(内容無し)
After Camp 2011『今日から始める函数型プログラミング』(内容無し)
 

Recently uploaded

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 

Recently uploaded (9)

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 

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

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