2011-02-20
メタプログラミングRuby 五日目を読んだ
- クラス拡張ミックスイン
で Perl6 だと
- 普通にRole かなぁ?
- attr_checked メソッドを生やす
- add_method で適当にアクセサを作る
- store する場所はぶっちゃけ,独立したattribute じゃなくてもいいよね.
アスキー・メディアワークス
売り上げランキング: 5690
メタプログラミングRuby 四日目を読んだ
- 特異クラス
- クラスインスタンス変数,クラスマクロ,アラウンドエイリアス
で,
- 特異クラスは たぶん Role を差してやればいいと思う
- alias は,なんかいい方法があるんだろうか.next とか?
- my &old_name := &thermo; &thermo = sub {}; とか普通にできるみたい(S06)
# our にすれば,class スコープに augment class MyClass { our $c; method c { $c } } # 別名を付けて,上書き augment class Str { .^add_method('real_chars', &chars); method chars { .real_chars > 5 ?? 'long' !! 'short' } }
アスキー・メディアワークス
売り上げランキング: 5690
メタプログラミングRuby 三日目を読んだ
- Proc と lambda と instance_eval かな
- scope の話
さて
- block は全てがクロージャです.
- method { } で,無名メソッドが作れる
- 第一引数がオブジェクト($obj.$method と $method($obj) が同じ)
- -> でも,引数を受け取るクロージャが作れる
- AUTOLOAD が使えればもうちょっとキレイに作れるような
- set / get を使わない方向で
- :key(value) 形式は名前付きパラメータに取られてる?
- our を使わないとsubで定義したのにblock を超えられなかった.逆じゃね?
- require が .pm じゃないと駄目になってる?
- glob() がわからん.
setup method { $.set('key' => 'value'); } event "name", method { $.get('key'); };
アスキー・メディアワークス
売り上げランキング: 5690
2011-02-17
メタプログラミングRuby 二日目を読んだ
Module#method_missing() と define_method(), Object#send() あたり.
AUTOLOAD(=CANDO) と 動的定義か.
multi CANDO (MyPackage, $type, $name, *%args --> Container) { ... } my $name = '&' . 'aaa'; ::<$name> = method { ... }
みたく,CANDO とか動的定義でできそうだけど,
そもそもCANDO は呼ばれないような…
まだ実装されてないのかねぇ.*1
動的定義もできない?
あと eval 以外にできるのかな?
(2011/02/20 追記)
動的定義は,add_method を使えばいいのか.
アスキー・メディアワークス
売り上げランキング: 5690
*1:Indirect name lookups not yet implemented だから?
2011-02-13
メタプログラミングRuby 一日目を読んだ
まとめを抜粋
- オブジェクトは複数のインスタンス変数とクラスへのリンクで構成されている.
- オブジェクトのメソッドはオブジェクトのクラスに住んでいる(クラスから見れば,それはインスタンスメソッドと呼ばれる)
- クラスはClass クラスのオブジェクトである.クラス名は単なる定数である.
- Class はModule のサブクラスである.モジュールはメソッドを集めたものである.クラスはnew() でインスタンス化したり,superclass()で階層構造を作ったりできる.
- 定数はファイルシステムのようにツリー上に配置されている.モジュールやクラスの名前がディレクトリ,通常の定数がファイルのようになっている
- クラスはそれぞれBasicObject まで続く継承チェーンを持っている.
- メソッドを呼び出すと,Ruby はレシーバのクラスに向かって一歩右へ進み,それから継承チェーンを上へ向かって進んでいく.メソッドを発見するか継承チェーンが終わるまでそれは続く.
- クラスがモジュールをインクルードすると,そのクラスの真上の継承チェーンにモジュールが挿入される.
- メソッドを呼び出すとき,レシーバが self になる.
- モジュール(あるいはクラス)を定義するとき,モジュールが self になる.
- インスタンス変数は常に self のインスタンス変数とみなされる.
- レシーバを明示的に指定せずにメソッドを呼び出すと,self のメソッドだとみなされる.
#!/usr/bin/env perl6 # -*- mode: perl; coding: utf-8-unix; -*- use v6; class MyClass { has $!v; method my_method { } } my $obj = MyClass.new say MyClass.WHAT; #=> MyClass() say $obj.^parents.perl; # => (Any, Mu) say $obj.^methods(:local).map({.name}).perl; #=> ("my_method")
メソッドサーチ,継承関係について,もうちょっと調べる必要があるな.
- REPL 便利
- .perl が inject 的に使える.p 的なものもある?
- ^XXXX と HOW.XXXX を使う
- class base と prototype base の両方が使える
アスキー・メディアワークス
売り上げランキング: 41489
2011-01-16
メタプログラミングRuby を読み始めた
Ruby の知識は全然足りない状態で読み始めた.
とりあえず,色々調べながらで最初全然進めない感じですよ.
調べたこと - Ruby
- Rakefile - test target を簡単に刺す
- Rakefile - default ターゲットの指定方法
gist にしようかと思ったけど,とりあえずそのまま貼る
構成としては,
Rakefile lib/object_model/alphanumeric.rb test/test_object_model_alphanumeric.rb
Rakefile
require 'rake/testtask' Rake::TestTask.new task :default => "test"
こんな感じ.
で,Perl で書き直してみた.
Makefile.PL lib/ObjectModel/Alphanumeric.pm t/ObjectModel_Alphanumeric.t
Makefile.PL
use inc::Module::Install; name 'ObjectModel-Alphanumeric'; all_from 'lib/ObjectModel/Alphanumeric.pm'; WriteAll;
lib/ObjectModel/Alphanumeric.pm
package ObjectModel::Alphanumeric; use strict; use warnings; # Perl5 は,そもそもネイティブなオブジェクト指向言語ではないので # autobox を使って,スカラにメソッドを刺せるようにする sub to_alphanumeric { ($_ = shift) =~ s/[^\w\s]//g; $_; } 1;
t/ObjectModel_Alphanumeric.t
#!/usr/bin/env perl use strict; use warnings; use Test::More; use FindBin; use lib qq|$FindBin::Bin/../lib|; use ObjectModel::Alphanumeric; use autobox SCALAR => 'ObjectModel::Alphanumeric'; is(ObjectModel::Alphanumeric::to_alphanumeric('#3, the *Magic, Number*?'), '3 the Magic Number'); is('#3, the *Magic, Number*?'->to_alphanumeric(), '3 the Magic Number'); done_testing;
ということで,とりあえず Rakefile, Makefile.PL を書く辺で止まっているけど,
順番にやっていこうと思う.
参考
アスキー・メディアワークス
売り上げランキング: 24616
2010-10-17
YAPC::Asia 2010 にいってきた
study, Perl, YAPC, TDD, PHP, Ruby
今回で二回目の参加になります
前回は,@issm さんと一緒に参加したんですけど,
今回は,@hatyuki さんも居て三人で回ったりもした感じでした.
それも ゆるくPerl を語る会 が出会いの場になったからですね.*1
ゆる Perl を開始してくれた id:trinity777 ++
時刻的にも,最後のまとめ的な位置付けということもあると思うのだけど,
最後のkeynote が一番心に残っているのですよ.
やっぱりid:miyagawa さんかっけー(miyagawa rocks) と思った訳です.
とあいえ,id:miyagawa さんのスライドにもあったけど,
Perl is glue language. なんすよ.
ちょっと話が飛びますが,id:nekokak さんの発表であったんだけど,
id:kazuhooku が書いてるから安心みたいな話があって,
普通に納得したりしてた.*2
一定の信頼があって,繋りがあるってことかなー.と思うんですよ.
その辺がglue なんかなー.とか.
つまりはPerl は最初から他のものの力を借りるように
デザインされていたんだよ.(Ω ΩΩ<な,なんだってー)
オブジェクト指向って,メッセージパッシング,疎結合みたいな独立したオブジェクトがあって,
それがいっぱい集まって有機的に何かを形成しているみたいなイメージ*3
があるんで,そういうモデルなんかなー.とか.*4
Larry も言ってたんだけど,
"楽しまなければならない"
好きなことをやればいいと思うのですよ.
やりたいことをやればいい.
コードを書いたり,いろいろすればいいと思うのです.
それで join するみたいなイメージを自分は持ちました.
ということで,萌えもポロリも涙も笑いもSQLインジェクションもある.
YAPC::Asia 2011 に,みなさんも行ってみませんか?*5
今後の話
そういう訳で,ゆる Perl も何回か続けてみたけど,
どうやら継続できそうに思えたので,
今度は Nagoya.pm にバージョンアップしてみて,
ゆるPerl 自体の活動が変わる訳じゃないんだけど,
だんだん,みんなが楽しめるようなことをやるように変化していきたいな.と思っています.*6
そんで,rocks と思われる存在になるのもいいんだけど,
自分なんかはそんなにスゴイ人じゃないし,コミュニティにコミットしてないので,できてないので駄目じゃん.じゃなくても.
まずは rocks と言われてる人を見て欲しい.
その空気みたいなものを Nagoya.pm の人と一緒に感じたいなー.とは思いました.
よせがき?
あ,かってに後夜祭の中で,いっぱいサインしてもらいました.
提案してくれた id:nipotan さん,id:yappo さん,他サインしてもらったみなさんありがとうございましたー.
本当,旧なお願いで申し訳ありませんでした.*7
脱線話1
JavaScript をテストするJSTAPd の話とか,
mod_rewrite をテストする話とか,
省サーバ運用の話でid:nekokak さんが自分が決めたところまでは自分で見たいみたいな話があって,
そういう感覚って,完全に TDD の安心に繋がってるのかなー.とか思ったりもしてみた.
というか,Perl 界隈でテスト書かないとか無いですよね.みたいな*8
ということで,TDD 的な思想が当たり前過ぎてグリーンバンドをしてたけど,誰も触れてくれなかったYO!
脱線話2
Perl の人(主にd の付く人)は PHP をあまりイジめないでください,とか
Perl の人怖いとかいう話もあって,*9
うーん.評価とイジメは違うんだけどなー.
とか,PHP をHack するみたいな発想が,そもそもないのかなー.とかは思ったりした.
Ruby 界隈はそういうのも充分懐が広い気が(勝手に)してる.*10
あー,これもPHP DIS ってる,とか言われちゃうかなー?
リンク
- サインしてもらいました
オライリージャパン
売り上げランキング: 1530



- とりあえず
日経BP社
売り上げランキング: 128284






- たまたま思い出した
オーム社
売り上げランキング: 134342




*1:途中一緒に昼食したとき,PHP のライブラリのポーティングの話をずーっとしてたのは秘密だ.
*2:誤解して欲しくないんだけど,無条件に受け入れるという話ではなく,理由があってやっているだろうから聞けばわかるだろうな.という予想みたいな話
*3:Smalltalk で学ぶオブジェクト指向プログラミングの本質
*4:逆か?自分にはそういう心理モデルがあるから,そう理解してしまうだけ?そう認識するだけ?Naming is hard
*5:あり?Hokkaido.pm だっけ?
*6:ゆるPerl in 岡山.とか?
*7:してもらったサインは,スタッフが美味しくいただきました.後で上げる?
*8:id:yappo さんのセッションのときでもテスト書いてない型?と訊かれて誰も(?)手を上げてなかったような
*9:主に id:tokuhirom の人だけじゃね?という意見があったり無かったり
*10:OOP 界隈と密結合で,ファシリテーションとかあるから?メタプログラミングが関係するとか?そういえば PHP のメタプログラミングの話もしたなー(閑話休題)