クラなんとか or くらなんとか or cla なんとかの日記

2011-02-20

メタプログラミングRuby 五日目を読んだ

  • クラス拡張ミックスイン

で Perl6 だと

  • 普通にRole かなぁ?
    • attr_checked メソッドを生やす
    • add_method で適当にアクセサを作る
    • store する場所はぶっちゃけ,独立したattribute じゃなくてもいいよね.

メタプログラミングRuby
Paolo Perrotta
アスキー・メディアワークス
売り上げランキング: 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'
    }
}

メタプログラミングRuby
Paolo Perrotta
アスキー・メディアワークス
売り上げランキング: 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');
};


メタプログラミングRuby
Paolo Perrotta
アスキー・メディアワークス
売り上げランキング: 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 を使えばいいのか.

メタプログラミングRuby
Paolo Perrotta
アスキー・メディアワークス
売り上げランキング: 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 の両方が使える

メタプログラミングRuby
Paolo Perrotta
アスキー・メディアワークス
売り上げランキング: 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 を書く辺で止まっているけど,

順番にやっていこうと思う.

参考

メタプログラミングRuby
Paolo Perrotta
アスキー・メディアワークス
売り上げランキング: 24616

2010-10-17

YAPC::Asia 2010 にいってきた

今回で二回目の参加になります

前回は,@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
おすすめ度の平均: 4.0
3 軽い読み物
5 個性豊かな言語設計者の考え方がわかる

  • とりあえず

Smalltalkで学ぶオブジェクト指向プログラミングの本質
青木 淳 浅岡 浩子 澤本 依里
日経BP社
売り上げランキング: 128284
おすすめ度の平均: 4.0
5 オブジェクト指向を習う
4 古典的な「Smalltalk-80」の子孫であるVisualWorksの入門書として
4 オブジェクト指向で1冊目じゃなきゃ
2 ちょっとこれは・・・
4 “純正”Smalltalk-80の流れを受け継ぐVisualWorksの入門書として

  • たまたま思い出した

情熱プログラマー ソフトウェア開発者の幸せな生き方
Chad Fowler
オーム社
売り上げランキング: 134342
おすすめ度の平均: 4.5
5 「ソフトウェア開発者の幸せな生き方」とは
3 並ではあるが若手(のみに)読ませたい
5 社会人のみならず、学生にも是非読んで欲しい一冊

*1:途中一緒に昼食したとき,PHP のライブラリのポーティングの話をずーっとしてたのは秘密だ.

*2:誤解して欲しくないんだけど,無条件に受け入れるという話ではなく,理由があってやっているだろうから聞けばわかるだろうな.という予想みたいな話

*3:Smalltalk で学ぶオブジェクト指向プログラミングの本質

*4:逆か?自分にはそういう心理モデルがあるから,そう理解してしまうだけ?そう認識するだけ?Naming is hard

*5:あり?Hokkaido.pm だっけ?

*6:ゆるPerl in 岡山.とか?

*7:してもらったサインは,スタッフが美味しくいただきました.後で上げる?

*8id:yappo さんのセッションのときでもテスト書いてない型?と訊かれて誰も(?)手を上げてなかったような

*9:主に id:tokuhirom の人だけじゃね?という意見があったり無かったり

*10:OOP 界隈と密結合で,ファシリテーションとかあるから?メタプログラミングが関係するとか?そういえば PHP のメタプログラミングの話もしたなー(閑話休題)