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.
人類の役に立たない
DSL、そしていつから
Rubyが最高の言語だと
錯覚してた? with PHP
RubyHiroba 2014 うさみけんた@ぞ
お前誰よ
• うさみけんた a.k.a. Zonu.EXE(ぞ)
• Twitter: @tadsan; GitHub: @zonuexe
• %r/たっ?どさん/ と呼ぶと反応します 
• 好き: カラオケ、アニメソング、やる夫スレ
• 20...
お前誰よ
• プログラム書いてみたいけど書けなかった
• 2010年頃になんとかRubyとJavaScriptおぼえた
• 趣味でやってきたので遊び気分が抜けてない
• 実際に動くサービスを作るよりも、言語の仕様
とか処理系で遊んでる方が楽しか...
大学を4年間で卒業できなかったけど、特に就職活動とかしてな
かったから札幌のアパートを引き払って実家から大学通って卒業
までの単位数を確保しつつ札幌で証明書ベンダーでアルバイトさ
せてもらってたけど諸々の経緯があり実家に引き込もることにな
り自...
さて
プログラ
ミングは

楽しい
コードは書
いた通り動
いてくれる
構文の自由度が
高く高階函数が
メソッドの文法
に組込まれてる
// JavaScriptの場合
var strToInt = function(v){ return parseInt(v); };
["1", "2", "3"].map( strToInt );
["1", "2", "3"].map( ...
それが人類の
役に立たない
コードであっ
ても楽しい
scripter = ->(*args){ ->{ puts args.join("n") } }
title = ->(text) { "『#{text}』n" }
paragraph = ->(*args){ args.join("n") ...
『俺より強い奴に、会いに行く』
ピンポーン
リュウ「こんにちは」
たかし「はいどなた」
リュウ「いまちょっといいですか」
たかし「これから出かけます」
リュウ「午後出勤ですか?」
たかし「はい」
リュウ「強そうですね」
たかし「なにがですか」
...
フリースタイルで
式指向の言語なの
で、かなり自由な
位置に括弧を挿入
することができて
すごいおもしろい
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 'awesom...
# 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, ...
PHPのmap
# php
<?php
$ary = [[1, 3], [2, 4]];
trait Foo{
function bar(array $v) {
return $v[0] + $v[1] * 10;
}
}
array_map(...
# 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(...
PHPにも
学びはある
タイプヒント
# php
function foo(array $config = []){ … }
foo(1);
#=> PHP Catchable fatal error:
Argument 1 passed to foo() must ...
クロージャ
# 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,,_
      |ヽ、)
 ...
Upcoming SlideShare
Loading in …5
×

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

1,306 views

Published on

RubyHiroba 2014で発表したような気がする

Published in: Technology
  • Be the first to comment

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

  1. 1. 人類の役に立たない DSL、そしていつから Rubyが最高の言語だと 錯覚してた? with PHP RubyHiroba 2014 うさみけんた@ぞ
  2. 2. お前誰よ • うさみけんた a.k.a. Zonu.EXE(ぞ) • Twitter: @tadsan; GitHub: @zonuexe • %r/たっ?どさん/ と呼ぶと反応します • 好き: カラオケ、アニメソング、やる夫スレ • 2012年に脱北して東京にきました
  3. 3. お前誰よ • プログラム書いてみたいけど書けなかった • 2010年頃になんとかRubyとJavaScriptおぼえた • 趣味でやってきたので遊び気分が抜けてない • 実際に動くサービスを作るよりも、言語の仕様 とか処理系で遊んでる方が楽しかった
  4. 4. 大学を4年間で卒業できなかったけど、特に就職活動とかしてな かったから札幌のアパートを引き払って実家から大学通って卒業 までの単位数を確保しつつ札幌で証明書ベンダーでアルバイトさ せてもらってたけど諸々の経緯があり実家に引き込もることにな り自宅警備を休業して東京をぷらぷらしたあと某社の紹介で9月 から11月の予定で働くことになったけど急に10月いっぱいで引 き上げてくれとのことで連絡がきたので、だめもとだったけど後 腐れもなく現職の面接を受けて運よく無事に通ってしまったので PHPの会社に入社したのだけれど社会には闇があることは知れた し特に某社を弾劾する目的ではないので今回は特に触れません。 まあどうでもいいですね
  5. 5. さて
  6. 6. プログラ ミングは
 楽しい
  7. 7. コードは書 いた通り動 いてくれる
  8. 8. 構文の自由度が 高く高階函数が メソッドの文法 に組込まれてる
  9. 9. // 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 }
  10. 10. それが人類の 役に立たない コードであっ ても楽しい
  11. 11. 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[] スクリプト(台本)
  12. 12. 『俺より強い奴に、会いに行く』 ピンポーン リュウ「こんにちは」 たかし「はいどなた」 リュウ「いまちょっといいですか」 たかし「これから出かけます」 リュウ「午後出勤ですか?」 たかし「はい」 リュウ「強そうですね」 たかし「なにがですか」 リュウ「態度が」 リュウは、自分より強そうな奴に、会いにいったのだった。 完 台本を出力(実行結果)
  13. 13. フリースタイルで 式指向の言語なの で、かなり自由な 位置に括弧を挿入 することができて すごいおもしろい
  14. 14. MatzLisp!
  15. 15. DSLを(比較 的)作りやす い(個人の感想)
  16. 16. (予防線を張ってお くとrubyも最高の 言語ではなくもっと DSLを作りやすい言 語はいろいろある)
  17. 17. さて
  18. 18. プログラ ミングは
 楽しい
  19. 19. (いつからRuby が最高のプログ ラミング言語だ と錯覚してた?)
  20. 20. Rails以後の世界 でもPHPは平然と としてでも社会に 価値を提供してる
  21. 21. そもそも Rubyは最高 なのか?
  22. 22. 入門言語として Rubyを手放し で勧められるか
  23. 23. オープンク ラスは本当 に最高か?
  24. 24. 無関係のライ ブラリが簡単 に衝突する
  25. 25. 標準クラスが requireしたラ イブラリに汚染 される
  26. 26. # ruby # hoge.rb class Hoge … #べんりライブラリ end class Array def hoge # hogeライブラリのべんり処理 end end Rubyとオープンクラス
  27. 27. # ruby # awesome/array.rb class Array def method_missing name, value # なんかすごい処理をしてくれる end end # awesome.rb require 'awesome/array' array.hoge.each(&:init) #なんか初期化 Rubyとオープンクラス
  28. 28. # ruby require 'hoge' p [1, 2, 3].hoge #=> ちゃんとうごく require 'awesome' #=> なんかエラーでる Rubyとオープンクラス
  29. 29. 最近はむやみに標準クラ スを汚染しないみたいな 空気もあるにはあるけど 紳士協定にすぎないし refinementsもあるけ ど危険を避けられてない
  30. 30. Rubyのメソッ ドと変数はわか りにくくないか
  31. 31. # ruby foo = "foo" def foo "FOO" end p foo メソッドと変数 同じ名前のローカル変数と メソッドがあると、変数が優先される
  32. 32. メソッドと変数 # python foo = "foo" def foo(): return "FOO" print(foo) #=> <function foo at 0x108e6a8c0> 函数は代入文と同じ変数空間 なので、defが上書きする ()をつけないと函数呼び出し ではないので、函数そのもの がプリントされる
  33. 33. メソッドと変数 # php $foo = "foo"; function foo() { return "FOO"; } var_dump($foo); var_dump(foo()); 変数には$が必須。 そもそも名前空間が別物なの で、衝突しないことは明確。
  34. 34. map
  35. 35. 配列の要素にお なじ処理を適用 したものを返す
  36. 36. 高階函数とは? // Rubyの場合 str_to_int = ->(v){ v.to_i } ["1", "2", "3"].map( &str_to_int ) ["1", "2", "3"].map{|v| v.to_i }
  37. 37. 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)) 超わかりやすい!
  38. 38. 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)); 完全にわかりやすい!!
  39. 39. # 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 メソッドの再利用は
 実は意外にめんどい
  40. 40. PHPにも 学びはある
  41. 41. タイプヒント # 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
  42. 42. クロージャ # ruby jojo = ["joseph", "jotaro", "josuke"] is_jojo = ->(name) { return jojo.include?(name) }
  43. 43. クロージャ # php $jojo = ["joseph", "jotaro", "josuke"]; $is_jojo = function ($name) use ($jojo) { return in_array($name, $jojo); };
  44. 44. 捕捉変数の 明示vs暗黙
  45. 45. どちらが良い かは議論があ るところ
  46. 46. まとめ
  47. 47. Rubyの設計が手 放しで最高である わけではない点に ついて紹介した
  48. 48. 言語設計に王道はな く、それぞれの言語 は落としどころを見 つけながら現在の仕 様に落ち着いてる
  49. 49. 使用フォント セプテンバー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⌒) ./| _ノ  __ノ

×