SlideShare une entreprise Scribd logo
1  sur  49
Télécharger pour lire hors ligne
人類の役に立たない
DSL、そしていつから
Rubyが最高の言語だと
錯覚してた? with PHP
RubyHiroba 2014 うさみけんた@ぞ
お前誰よ
• うさみけんた a.k.a. Zonu.EXE(ぞ)
• Twitter: @tadsan; GitHub: @zonuexe
• %r/たっ?どさん/ と呼ぶと反応します 
• 好き: カラオケ、アニメソング、やる夫スレ
• 2012年に脱北して東京にきました
お前誰よ
• プログラム書いてみたいけど書けなかった
• 2010年頃になんとかRubyとJavaScriptおぼえた
• 趣味でやってきたので遊び気分が抜けてない
• 実際に動くサービスを作るよりも、言語の仕様
とか処理系で遊んでる方が楽しかった
大学を4年間で卒業できなかったけど、特に就職活動とかしてな
かったから札幌のアパートを引き払って実家から大学通って卒業
までの単位数を確保しつつ札幌で証明書ベンダーでアルバイトさ
せてもらってたけど諸々の経緯があり実家に引き込もることにな
り自宅警備を休業して東京をぷらぷらしたあと某社の紹介で9月
から11月の予定で働くことになったけど急に10月いっぱいで引
き上げてくれとのことで連絡がきたので、だめもとだったけど後
腐れもなく現職の面接を受けて運よく無事に通ってしまったので
PHPの会社に入社したのだけれど社会には闇があることは知れた
し特に某社を弾劾する目的ではないので今回は特に触れません。
まあどうでもいいですね
さて
プログラ
ミングは

楽しい
コードは書
いた通り動
いてくれる
構文の自由度が
高く高階函数が
メソッドの文法
に組込まれてる
// JavaScriptの場合
var strToInt = function(v){ return parseInt(v); };
["1", "2", "3"].map( strToInt );
["1", "2", "3"].map( function(v){ return parseInt(v); } );
高階函数とは?
// Rubyの場合
str_to_int = ->(v){ v.to_i }
["1", "2", "3"].map( &str_to_int )
["1", "2", "3"].map{|v| v.to_i }
それが人類の
役に立たない
コードであっ
ても楽しい
scripter = ->(*args){ ->{ puts args.join("n") } }
title = ->(text) { "『#{text}』n" }
paragraph = ->(*args){ args.join("n") + "n" }
chara = ->(name) { ->(text){ "#{name}「#{text}」"} }
ryu = chara[:リュウ]; tak = chara[:たかし]
script = scripter[title[:俺より強い奴に、会いに行く],
paragraph[:ピンポーン, ryu[:こんにちは], tak[:はいどなた]],
paragraph[ryu[:いまちょっといいですか], tak[:これから出かけます]],
paragraph[ryu[:午後出勤ですか?], tak[:はい]],
paragraph[ryu[:強そうですね], tak[:なにがですか]],
paragraph[ryu[:態度が]],
paragraph[:リュウは、自分より強そうな奴に、会いにいったのだった。 完]
]
script[]
スクリプト(台本)
『俺より強い奴に、会いに行く』
ピンポーン
リュウ「こんにちは」
たかし「はいどなた」
リュウ「いまちょっといいですか」
たかし「これから出かけます」
リュウ「午後出勤ですか?」
たかし「はい」
リュウ「強そうですね」
たかし「なにがですか」
リュウ「態度が」
リュウは、自分より強そうな奴に、会いにいったのだった。 完
台本を出力(実行結果)
フリースタイルで
式指向の言語なの
で、かなり自由な
位置に括弧を挿入
することができて
すごいおもしろい
MatzLisp!
DSLを(比較
的)作りやす
い(個人の感想)
(予防線を張ってお
くとrubyも最高の
言語ではなくもっと
DSLを作りやすい言
語はいろいろある)
さて
プログラ
ミングは

楽しい
(いつからRuby
が最高のプログ
ラミング言語だ
と錯覚してた?)
Rails以後の世界
でもPHPは平然と
としてでも社会に
価値を提供してる
そもそも
Rubyは最高
なのか?
入門言語として
Rubyを手放し
で勧められるか
オープンク
ラスは本当
に最高か?
無関係のライ
ブラリが簡単
に衝突する
標準クラスが
requireしたラ
イブラリに汚染
される
# ruby
# hoge.rb
class Hoge
… #べんりライブラリ
end
class Array
def hoge
# hogeライブラリのべんり処理
end
end
Rubyとオープンクラス
# ruby
# awesome/array.rb
class Array
def method_missing name, value
# なんかすごい処理をしてくれる
end
end
# awesome.rb
require 'awesome/array'
array.hoge.each(&:init) #なんか初期化
Rubyとオープンクラス
# ruby
require 'hoge'
p [1, 2, 3].hoge
#=> ちゃんとうごく
require 'awesome'
#=> なんかエラーでる
Rubyとオープンクラス
最近はむやみに標準クラ
スを汚染しないみたいな
空気もあるにはあるけど
紳士協定にすぎないし
refinementsもあるけ
ど危険を避けられてない
Rubyのメソッ
ドと変数はわか
りにくくないか
# ruby
foo = "foo"
def foo
"FOO"
end
p foo
メソッドと変数
同じ名前のローカル変数と
メソッドがあると、変数が優先される
メソッドと変数
# python
foo = "foo"
def foo():
return "FOO"
print(foo)
#=> <function foo at 0x108e6a8c0>
函数は代入文と同じ変数空間
なので、defが上書きする
()をつけないと函数呼び出し
ではないので、函数そのもの
がプリントされる
メソッドと変数
# php
$foo = "foo";
function foo() {
return "FOO";
}
var_dump($foo);
var_dump(foo());
変数には$が必須。
そもそも名前空間が別物なの
で、衝突しないことは明確。
map
配列の要素にお
なじ処理を適用
したものを返す
高階函数とは?
// Rubyの場合
str_to_int = ->(v){ v.to_i }
["1", "2", "3"].map( &str_to_int )
["1", "2", "3"].map{|v| v.to_i }
Pythonのmap
# python
ary = [[1, 3], [2, 4]]
class Foo:
@staticmethod
def bar(v):
return v[0] + v[1] * 10
list(map(Foo.bar, ary))
超わかりやすい!
PHPのmap
# php
<?php
$ary = [[1, 3], [2, 4]];
trait Foo{
function bar(array $v) {
return $v[0] + $v[1] * 10;
}
}
array_map('Foo::bar', $ary));
完全にわかりやすい!!
# ruby
ary = [[1, 2], [3, 4]]
module Foo
def bar(v); v[0] + v[1] * 10; end
module_function :bar
end
p ary.map{|v| Foo.foo(v) }
# 短く書くには…?
## たぶん短くならない
Rubyのmap
メソッドの再利用は

実は意外にめんどい
PHPにも
学びはある
タイプヒント
# php
function foo(array $config = []){ … }
foo(1);
#=> PHP Catchable fatal error:
Argument 1 passed to foo() must be of
the type array, string given, called
in Command line code on line 1 and
defined in Command line code on line 1
クロージャ
# ruby
jojo = ["joseph", "jotaro", "josuke"]
is_jojo = ->(name) {
return jojo.include?(name)
}
クロージャ
# php
$jojo = ["joseph", "jotaro", "josuke"];
$is_jojo = function ($name) use ($jojo)
{
return in_array($name, $jojo);
};
捕捉変数の
明示vs暗黙
どちらが良い
かは議論があ
るところ
まとめ
Rubyの設計が手
放しで最高である
わけではない点に
ついて紹介した
言語設計に王道はな
く、それぞれの言語
は落としどころを見
つけながら現在の仕
様に落ち着いてる
使用フォント
セプテンバーM・L
IPAex明朝  
M+ 1c black
   _
   \ヽ, ,、
     `''|/ノ
      .|
 _    |
 \`ヽ、|
   \, V
      `L,,_
      |ヽ、)
     .|
    /           ,、
    /        ヽYノ
   .|       r''ヽ、.|
   |        `ー-ヽ|ヮ
    |            `|
   ヽ,    ,r      .|
     ヽ,r'''ヽ!'-‐'''''ヽ、ノ
 ,,,..---r'",r, , 、`ヽ、 ヾ
 ヽ、__/ ./ハレハ i`ヽ、 `''r`ミ_
   .レ//r,,,、 レ'レハヾ,  L,,_ `ヽ、
    "レ, l;;;l   l;;;l`i.リレ' リ ̄~~
     ヽ、 ワ `"/-'`'`'
       `''''''''"      ┼ヽ  -|r‐、. レ |
                 d⌒) ./| _ノ  __ノ

Contenu connexe

Similaire à 人類の役に立たないDSL、そしていつからRubyが最高の言語だと錯覚してた? with PHP

よいことも悪いこともぜんぶPHPが教えてくれた
よいことも悪いこともぜんぶPHPが教えてくれたよいことも悪いこともぜんぶPHPが教えてくれた
よいことも悪いこともぜんぶPHPが教えてくれたMoriyoshi Koizumi
 
そんな装備で大丈夫か?
そんな装備で大丈夫か?そんな装備で大丈夫か?
そんな装備で大丈夫か?2celeb
 
Rubyはとても「人間的」
Rubyはとても「人間的」Rubyはとても「人間的」
Rubyはとても「人間的」Kazuhiro Serizawa
 
PHPBLT#6 PHPの未来に入るかもしれない機能の紹介
PHPBLT#6 PHPの未来に入るかもしれない機能の紹介PHPBLT#6 PHPの未来に入るかもしれない機能の紹介
PHPBLT#6 PHPの未来に入るかもしれない機能の紹介sters
 
Nom de fonction français
Nom de fonction françaisNom de fonction français
Nom de fonction françaishajikami
 
20111029 rubyon php
20111029 rubyon php20111029 rubyon php
20111029 rubyon phpdo_aki
 
Cake assets plugin in PHP Matsuri 2012
Cake assets plugin in PHP Matsuri 2012Cake assets plugin in PHP Matsuri 2012
Cake assets plugin in PHP Matsuri 2012Hirohide Sano
 

Similaire à 人類の役に立たないDSL、そしていつからRubyが最高の言語だと錯覚してた? with PHP (7)

よいことも悪いこともぜんぶPHPが教えてくれた
よいことも悪いこともぜんぶPHPが教えてくれたよいことも悪いこともぜんぶPHPが教えてくれた
よいことも悪いこともぜんぶPHPが教えてくれた
 
そんな装備で大丈夫か?
そんな装備で大丈夫か?そんな装備で大丈夫か?
そんな装備で大丈夫か?
 
Rubyはとても「人間的」
Rubyはとても「人間的」Rubyはとても「人間的」
Rubyはとても「人間的」
 
PHPBLT#6 PHPの未来に入るかもしれない機能の紹介
PHPBLT#6 PHPの未来に入るかもしれない機能の紹介PHPBLT#6 PHPの未来に入るかもしれない機能の紹介
PHPBLT#6 PHPの未来に入るかもしれない機能の紹介
 
Nom de fonction français
Nom de fonction françaisNom de fonction français
Nom de fonction français
 
20111029 rubyon php
20111029 rubyon php20111029 rubyon php
20111029 rubyon php
 
Cake assets plugin in PHP Matsuri 2012
Cake assets plugin in PHP Matsuri 2012Cake assets plugin in PHP Matsuri 2012
Cake assets plugin in PHP Matsuri 2012
 

Plus de 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
 
はじめての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
 
黒歴史・闇RubyKaigi(美しいRubyと私 そして闇プログラミング)
黒歴史・闇RubyKaigi(美しいRubyと私 そして闇プログラミング)黒歴史・闇RubyKaigi(美しいRubyと私 そして闇プログラミング)
黒歴史・闇RubyKaigi(美しいRubyと私 そして闇プログラミング)Kenta USAMI
 

Plus de 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
 
はじめての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『今日から始める函数型プログラミング』(内容無し)
 
黒歴史・闇RubyKaigi(美しいRubyと私 そして闇プログラミング)
黒歴史・闇RubyKaigi(美しいRubyと私 そして闇プログラミング)黒歴史・闇RubyKaigi(美しいRubyと私 そして闇プログラミング)
黒歴史・闇RubyKaigi(美しいRubyと私 そして闇プログラミング)
 

人類の役に立たないDSL、そしていつからRubyが最高の言語だと錯覚してた? with PHP