2014-03-04 (Tue) [長年日記]
_ 松江Ruby会議05予告
松江Ruby会議05でライブコーディングをすることになったが、「Module#prependとRefinementsで遊ぶ」というタイトルだけ出して、実は内容を考えてなかった。
以下のようなAspectJ風のコードを書くためのaspect.rbを実装しようと思う。
require "aspect"
class Job
def run
raise "subclass must override Command#execute"
end
end
class PrintJob < Job
def run
puts "running PrintJob..."
end
end
class BackupJob < Job
def run
puts "running BackupJob..."
end
end
module Logging
extend Aspect
JOBS = execution(class: Job, method: :run)
around JOBS do |join_point|
STDERR.puts("enter #{join_point.signature}")
begin
join_point.proceed
ensure
STDERR.puts("exit #{join_point.signature}")
end
end
end
jobs = [PrintJob.new, BackupJob.new]
jobs.each(&:run)
実質20分くらいの持ち時間で上手く書けるかどうか。お楽しみに。
2014-03-15 (Sat) [長年日記]
_ 松江Ruby会議05
松江Ruby会議05に参加してきた。参加されたみなさん、おつかれさまでした。
ライブコーディングがテーマだったので色んな人のコードを見られて楽しかった。まつもとさんも珍しく書き下ろしのコードを紹介してたし。
とくに圧巻だったのはDXRuby作者のmirichiさんのライブコーディングで、15分程度(?)でその場で一からブロック崩しを作られていた。 スプライトの衝突判定にSprite#===を使われていたのが印象的だったけど、たぶんcaseやgrepで使えるようにという設計なんだろう。
自分がライブコーディングで書いたコードは以下のURLに置いておいた。
このコードだと単純なpointcutしか表現できないけど、例えば、
class Foo
def bar
Bar.new.baz
end
end
のようなコードがあった時に、AspectJみたいにwithin(Foo) & call(class: Bar, method: :baz)みたいなpointcutの指定(Fooの中のBar#bazの呼び出しだけにアスペクトを織り込む)ができると使いやすそう。
しかし、Module#prependだとメソッドの呼び出し側でなく呼び出されるメソッドの側を置き換えるので、Fooから呼び出されたかどうかの判定に呼び出し元のクラスの情報が必要になるが、Rubyレベルではその情報を取るAPIがない。 気が向いたらrb_debug_inspector_open()とかを濫用して作るかもしれないけど、呼び出し元のクラスくらいは普通にRubyレベルで取れてもいいように思う。
_ 宮国 [私は宮崎で木工作家をしている宮国と申します。 現在は仕事の傍ら、以下のウェブサイトを運営しております。 四畳半大学..]
_ shugo [コメントありがとうございます。 レポートを興味深く拝見しましたが、問題意識に共感いただけたことを嬉しく思います。 ..]
_ 宮国 [見ていただいてありがとうございました。コメントもありがとうございます。 卒業論文であのようなレベルのものが書けるのは..]