root/docs/yappo/20080515-yapcasia2008/yapcasia2008-hintshash.pl

Revision 11698, 7.2 kB (checked in by yappo, 8 months ago)

add YAPC::Asia 2008 talks

Line 
1use strict;
2use warnings;
3use utf8;
4use lib 'lib';
5
6use Plusen;
7
8my $p = Plusen->bootstrap({
9    config => {
10        meta  => {
11            title => "Let's enjoy Perl on the %^H",
12            author => 'Kazuhiro Osawa - ( Yappo )',
13            email => 'yappo <at> shibuya <döt> pl',
14        },
15        plugins => [
16            { module => 'ScriptLoader::Simple' },
17#            { module => 'Device::MozRepl', },
18            { module => 'Device::Term', },
19#            { module => 'Device::Growl', },
20            { module => 'Device::ControlFromFile', config => { path => '/tmp/devsumi-ctl.txt' } },
21        ],
22    },
23});
24
25__DATA__
26
27===
28title: who are yappo
29list:
30 - at the Infomarks Corp.
31 - YAPC::Asia 2008 のすぽんさ
32 - 'PAUSE ID: YAPPO'
33 - CodeRepos maintainer
34
35===
36title: and
37
38===
39title: 征夷大将軍
40img: seiitaishougun.jpg
41
42===
43title: ここまで昨日のコピペ
44
45===
46title: "Today's talks"
47
48===
49title: not
50
51===
52title: mooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooose
53
54===
55title: se
56
57===
58title: そして今日はとても真面目な話です
59
60===
61title: Termに切り替える
62
63===
64title: 今日は%^Hの話をします
65
66===
67title: encoding::warnings
68
69===
70title: 言及しないお
71
72===
73title: 時には無茶ぶりをスルーする事も必要です
74
75===
76title: %^H ってなに?
77list:
78 - hinthash と呼ばれてる
79 - hintbits の親戚
80 - hintbits って $^H の事ね
81 - 5.10 で出来たわけでは無い
82 - 例えば autobox でもちょっと使ってる
83
84===
85title: 5.8 での使い方を見てみましょう
86
87===
88title: normal.pm
89code: |
90 package normal;
91 use strict;
92 use warnings;
93 sub import {
94  $^H{$_[0]} = ($_[1] || 'default') }
95 sub unimport { delete $^H{(shift)} }
96 1;
97
98===
99title: run-normal.pl
100code: |
101 use strict;
102 use warnings;
103 use Data::Dumper;
104 print "---- running\n";
105 use normal;
106 no normal;
107 use normal 'larry';
108 if (1) {
109     use normal 'ingy';
110 }
111
112===
113title: run
114
115===
116title: レキシカルコープとか関係ないんだよね。。。
117
118===
119title: レキシカルにしたい!
120list:
121 - それ hintbits でできるよ
122 - HINT_LOCALIZE_HH
123 - hint localize hint hash
124
125===
126title: with_hintbits
127code: |
128 package with_hintbits;
129 use strict;
130 use warnings;
131 my $hint_bits = 0x20000; # HINT_LOCALIZE_HH                                                                                     
132 sub import { $^H |= $hint_bits;
133  $^H{$_[0]} = ($_[1] || 'default') }
134 sub unimport { $^H &= ~ $hint_bits;
135  delete $^H{(shift)} }
136 1;
137
138===
139title: run-with_hintbits.pl
140code: |
141 use strict;
142 use warnings;
143 use Data::Dumper;
144 print "---- running\n";
145 use with_hintbits;
146 no with_hintbits;
147 use with_hintbits 'larry';
148 if (1) {
149  use with_hintbits 'ingy';
150 }
151
152===
153title: run
154
155===
156title: この方法って
157list:
158 - BEGIN フェーズでしか
159 - %^H がまともにつかえないから
160 - 活用するのがむづかしい
161
162===
163title: autoboxは上手くやってる
164
165===
166title: autobox
167list:
168 - Scope::Guard を hinthash に入れる
169 - HINT_LOCALIZE_HH も組み合わせてる
170 - autobox は定義をレキシカルスコープ
171 - 的に宣言して自然に使える
172 - %^Hのお陰
173 - 詳しくはソース読んでね
174
175===
176title: 5.10でどうなったのか
177
178===
179title: perldeltaによると(hio++)
180code: |
181 The implementation of the special variables $^H and %^H has changed, to allow implementing lexical pragmas in pure Perl.特殊変数 $^H 及び %^H の実装が, pure Perl でレキシカルプラグマを実装できるように変更されました.
182
183===
184title: on eval
185code: |
186 The compile-time value of the %^H hint variable can now propagate into eval("")uated code. This makes it more useful to implement lexical pragmas.%^H ヒント変数のコンパイル時の値は eval("") されたコードにも伝播するようになりました. これはレキシカルプラグマを実装するのにより一層役立ちます.
187
188===
189title: B
190code: |
191  (Joshua ben Jore) Its now possible to access the lexical pragma hints (%^H) by using the method B::COP::hints_hash(). It returns a B::RHE object, which in turn can be used to get a hash reference via the method B::RHE::HASH(). (Joshua ben Jore)レキシカルプラグマヒント(%^H)に B::COP::hints_hash() メソッドを使うことでアクセスできるようになりました. これは B::RHE オブジェクトを返し, さらに B::RHE::HASH() メソッドを通してhハッシュリファレンスを取得するために使うことができます.
192
193===
194title: よくわかんねw
195
196===
197title: かいつまむと
198list:
199 - レキシカルになったよ!
200 - (caller(0))[10] とかで
201 - hinthashとれるよ!
202 - strictみたいなpragmaを誰でも書けるよ!
203 - レキシカルプラグマ書き放題!
204
205===
206title: さっきのコードに5.10パワーを加えたら。。。
207
208===
209title: normal.pm(改)
210code: |
211 package normal;
212 use strict;
213 use warnings;
214 sub import {
215  $^H{$_[0]} = ($_[1] || 'default') }
216 sub unimport { delete $^H{(shift)} }
217 sub hinthash { (caller(0))[10] }
218 1;
219
220===
221title: run-normal-perl510.pl
222code: |
223 use Moose;use Data::Dumper;
224 print "---- running\n";
225 use normal;
226 warn "caller: " . Dumper(normal->hinthash);
227 no normal;
228 warn "caller: " . Dumper(normal->hinthash);
229 use normal 'larry';
230 warn "caller: " . Dumper(normal->hinthash);
231 if (1) {
232  use normal 'ingy';
233  warn "caller: " . Dumper(normal->hinthash);
234 }
235
236===
237title: run
238
239===
240title: そろそろ佳境
241
242===
243title: ブラウザに切り替える
244
245===
246title: abstractに
247code: |
248 hinthashと聞いてピンと来た人はもちろん、ピンとこなかった人もPerl5.10の強力なhinthash拡張を見れば世界が変わります。そうです、好き勝手にpragmaが作れちゃうのです。実践的なhinthashからド変態なhinthashまで全て見せます。
249
250===
251title: と書いちゃったんですが
252
253===
254title: 実践的なほう思いつかなかったので変態で攻めます
255
256===
257title: %^H の H は Hentai の H だったのだ
258
259===
260title: AA省略(MMR復活おめでとう
261
262===
263title: 5.10的な意味での変態的なhinthashの使い方をした教科書的なCPANモジュールがあるので紹介します
264
265===
266title: use dan;
267img: dankogai.jpg
268
269===
270title: これ以降のページはdanさんのプレゼン見ながら書いた
271
272===
273title: dan.pm
274list:
275 - 空気(文字リテラル)を読まなくなる
276 - もしくは
277 - 文字リテラルを置換する
278 - perl 5.10 から使ってね
279
280===
281title: danさんのプレゼンでPerlは空気を読むと連呼してたけど、dan.pmは読まなくなりますから!
282
283===
284title: example
285code: |
286 use strict;
287 use warnings;
288 use dan;
289 print "トラックバック予定地\n";
290 no dan;
291 print "助けてダンコーガイ\n";
292
293===
294title: example2
295code: |
296 use strict;
297 use warnings;
298 use dan cat_decode => sub {
299   my $str = shift;
300   $str =~ s/jcode.pl/Encode.pm/;
301   $str;
302 };
303 print "jcode.pl\n";
304
305===
306title: Run
307
308===
309title: つたえたいことは
310
311===
312title: dankogaiを大切にね!
313
314===
315title: thank you.
Note: See TracBrowser for help on using the browser.