例題: FizzBuzz • 数字を 1 から順に出力する、ただし – 3 で割り切れる場合は "Fizz" – 5 で割り切れる場合は "Buzz" – 両方で割り切れる場合は "FizzBuzz" を出力する • 普通の Ruby プログラミングで FizzBuzz n = 1 while true case when n % 15 == 0 then puts "FizzBuzz" when n % 3 == 0 then puts "Fizz" when n % 5 == 0 then puts "Buzz" else puts n end n += 1 end 7
コード構築メソッドを起動する• Ruby の for 文 for 変数 in コレクション do ... end 構文糖 コレクション.each do |変数| ... end∴ コード構築メソッドを each という名前にすれば ピリオドなしで呼び出せる “”.each ≒ for elem in “” do end 24
第一段階: アルファベットと数字で Ruby例: コード文字列 “p 1” を構築・ eval するコード class String def each 文字列を構成する様子 concat 112 “” concat 32 concat 112 concat 49 eval self “p” concat 32 exit end “p ” concat 49 end for i in “p 1” eval String nil do end 25
class String大文字を排除する def each ...• String の ”S” が 2 箇所 end end• class String の箇所 for i in – String クラスには定義できない String nil do end – トップレベルは Object クラス トップレベルに定義すればよい public def each• String nil の箇所 clear – 文字列を返す別のメソッドにする ... – String#clear で空文字列に end for i in String nil do inspect do end 26
第二段階: 小文字 alphabetと数字で Ruby例: “1” を出力するコード class String public def each def each concat 112 clear concat 32 concat 112 concat 49 concat 32 eval self concat 49 exit eval self end exit end end for i in for i in String nil do inspect do end end 27
数字を排除する(2)• 例外処理の構文 現在の self “...” begin A ensure B end – Java の try { A } finally { B } concat begin みたいなもの dup• 式全体が A の評価結果を返す ensure concat begin – A を評価し 65 を作る ensure – B を評価し clear end – B の評価結果を捨てて end A の評価結果を返す構文• 文字列の先頭に 1 文字追加 するイディオムが作れる “A...” 新しい self 29
loop do break public end catch inspect do def each loop do break clear end concat begin dup ensure clear concat concat concat concat size loop do break concat concat size end loop do break concat concat size end小文字アルファベットだけで Ruby を書く loop do break concat size end concat begin size ensure clear end end concat begin dup ensure clear concat concat concat concat concat concat size loop do break concat size end concat begin size ensure clear end end concat begin dup ensure clear loop do break concat concat size end concat concat concat concat size concat concat concat size concat begin size ensure clear end end concat begin dup ensure clear loop do break concat concat size end concat concat concat size loop do break concat concat size end concat concat concat size loop do break public end concat begin size ensure clear end end concat begin dup ensure clear loop do break concat concat size end loop do break concat concat size end concat concat concat concat size loop do break concat concat size end catch inspect do def each concat begin size ensure clear end end concat begin dup ensure clear loop do break concat concat size end concat concat concat size loop do break concat concat size end loop do break concat concat size end loop do break clear end loop do break concat concat size end loop do break concat size end concat begin size ensure clear end end concat begin dup ensure clear loop do break concat concat size end loop do break concat concat size end concat begin dup ensure clear concat concat concat size loop do break concat concat size end loop do break concat concat size end loop do break concat size end concat begin size ensure clear end end concat begin dup ensure clear concat concat concat concat size concat concat concat concat concat concat size concat begin size ensure clear end end concat begin dup ensure clear concat concat concat size loop do break concat concat size end concat concat concat size loop do break concat concat size end concat begin size ensure clear end end concat begin dup ensure clear loop do break concat concat size end concat concat concat size loop do break concat concat size end loop do break concat concat size end loop do break concat concat size end loop do break concat concat size end loop do break concat size end concat begin size ensure clear end end concat begin dup ensure clear loop do break concat concat size end concat concat concat size loop do break concat size end loop do break concat concat size end concat concat concat size concat begin size ensure clear end end concat begin dup ensure clear loop do break concat concat size end concat concat concat size concat begin size ensure clear end end loop do break concat concat size end concat concat concat size concat begin size ensure clear end end concat begin dup ensure clear loop do break concat concat size end concat concat concat concat size concat begin dup ensure clear concat concat concat size loop do break concat size end concat begin size ensure clear end end concat begin dup ensure clear concat concat concat concat size concat concat concat concat size concat concat concat concat concat concat size concat begin size ensure clear end end concat begin dup ensure clear concat concat concat concat size loop do break concat concat size end loop do break concat concat size end loop do break concat size end loop do break concat size end concat begin size ensure clear end end concat begin dup ensure clear loop do break concat concat size end loop do break concat concat size end concat concat concat concat size loop do break concat concat size end loop do break concat size end concat begin size ensure clear end end concat begin dup ensure clear loop do break concat concat size end loop do break concat concat size end concat concat concat size concat concat concat size concat begin size ensure clear end end concat begin dup ensure clear loop do break concat concat size end loop do break concat concat size end concat concat concat size concat concat concat size loop do break concat size end concat begin size ensure clear end end concat begin dup ensure clear loop do break concat concat size end loop do break concat concat size end concat concat concat concat concat size concat begin size ensure clear end end loop do break eval self end loop do exit end end end for each in inspect do 30 copyright mmxii yusuke end o h
関連研究: 他言語での文字制限の例• Perl: 記号だけ (Takesako [2005]) Quiz: これは何をするプログラムでしょう? まとめ Let’s 予約語プログラミング♪ #!/usr/bin/perl Perl 以外の言語でも実装できますか? sin cos and s qq qx xor s x x print uc chr lc awk ? ord qq sleep times x xor int log cos xor eval Haskell ? Lisp ? and eval and print uc chr ord scalar reverse ML ? qq exit binmode xor qq write qw xor print uc Perl → OK ! chr ord scalar reverse qw tell my print PHP ? Python ? 挑戦者求む! Ruby ? 正解 → 標準出力に “LLDN” という文字列を出力するプログラム2005/08/27 Lightweight Language Day and Night 4 2005/08/27 Lightweight Language Day and Night 18• Javascript – 記号だけ (Hasegawa [?]) – 顔文字だけ (Hasegawa [?]) 32
1–4 of 4 previous next Post a comment