コンテキストと仲良く
id:karupaneura
Kichijoji.pm #14
※今回のものを含む、ぼくがコミュニ
ティにおいて発表する全ての内容は、
特に明⾔言のない限り所属する組織や団
体の意思やスタンスなどを代弁ないし
表明するものでは⼀一切ありません。
※あくまでも個⼈人の考えに基づく内容
となりますので予めご了了承ください。
お断り
だれ
• かるぱねるら (@karupanerura) at DeNA
• Perl / Go / Python / Ruby / Java / etc..
• Japan Perl Association 理理事
• Gotanda.pm / Mackerel UG 発起⼈人
• Shibuya.pm 現リーダー (仮)
宣伝: Shibuya.pm #18
• 7/5(⽊木) 19:00-
• DeNA, Co,. LTD
• テーマ: あのCPANモジュールの裏側
• skaji
• songmu
こういうツイートをわざわざ
しちゃうくらいPerlが好き
今回のボツ題
よくあるPerl disへのdis
Perlに関してよく聞く話
Perlに関してよく聞く話
• シジル意味ある?邪魔では?
• リスト邪魔、全部リファレンスでいいじゃん
• なんでeqと==ふたつもあるの?無駄では?
• 数値がいつのまにか⽂文字列列になっててキモい
• 真偽値ないなんてありえない
これみんな
ただのコンテキストに
対する理理解不不⾜足だよ
全部コンテキストが背景にある
• シジル
• リスト
• ⽂文字列列演算⼦子と数値演算⼦子
• 数値、⽂文字列列、真偽値などの表現
コンテキストを理理解してなきゃ意味わからなくて当たり前
※とはいえちゃんと分からなくてもPerlは書けるよ!
tl;dr
• コンテキストを理理解すればPerlをdisる理理由が
ほぼなくなるよ
• 少なくとも他のLLと同じかそれ以下にはなる
コンテキスト
わかってしまえば
こわくない
字余り
コンテキスト #とは
ところで!
⼀一般的に⾔言われるコンテキスト
refs: https://www.google.co.jp/search?q=%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88
⼀一般的に⾔言われるコンテキスト

その2
refs: https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AF%E3%82%B9%E3%83%88
Perlにおけるコンテキストとは
• Perlでデータを扱うときに必ず扱われる概念
• データの型解釈の仕⽅方をPerlに伝えるルール
• コンテキストを理理解すればPerlでも型を⾃自在
にコントロールできる
• Perlわからん…ってなってしまった⼈人は⼤大抵
コンテキストを理理解すれば解決する
コンテキストを理理解する
=
Perlをもっと好きになる⼀一歩!
とはいえ、概念なので理理解が⼤大変。中級者以上向け
先⼈人達の知⾒見見
• たくさんあるので読むと良いです
• perldoc perldata
• ほか「Perl コンテキスト」でググるとたくさ
んでてくる
• 抽象的な概念なので⾊色んな⼈人の解釈やコード
を読んでイメージを⾃自分の中に作るのがコツ
おすすめスライド
refs. https://www.slideshare.net/KondoYoshiyuki/yapc2012-20120929
詳しい解説は今回はしません
知りたい⼈人はさっきの資料料読んでね
個⼈人的なコンテキスト考
あくまでも私⾒見見なので
そこんとこよろしく
perldoc perldata
• perldoc.jp訳
• 「Perl はスカラが⽂文字列列、数値、リファレ
ンス (オブジェクトを含みます)を 保持する
ことのできる⽂文脈的多態⾔言語 (contextually
polymorphic language) です。」
Contextually
Polymorphic
Language
データ型の違い
• 変数が3種類類ある
• スカラ/配列列/ハッシュ (単値とその集合)
• スカラは評価されるコンテキストで具体的な型
が決定する
• これがContextually Polymorphicたる所以
Perlは⾃自然⾔言語っぽい
というか⼈人間っぽいというか
• ⾃自然⾔言語っぽい書き味はコンテキストが作ってる
• コンテキストはPerlが(ルールベースで)⼈人間っぽく
「空気を読んで」データを解釈する仕組みと⾔言える
• Perlがどう空気を読んでくれるのかという仕様が
コンテキストの本質
• とにかく他のプログラミング⾔言語とは異異⾊色
「空気を読む」 #とは
• 演算⼦子の種類類など⽂文を形作るものが何かによっ
て、どのコンテキストかが定まる
• ただのルールなので覚えれば⼈人も分かる
• データが明確な型を持っている世界ではない
• コンテキストによってデータの型が確定する
• → 単純にパラダイムが異異なるので理理解が必要
でも、なんで…?
他の⾔言語と同じじゃダメ…?
私⾒見見
他の⾔言語と同じでも良い
けどPerlはこうしたかった
それはなぜか
Perlの主戦場はテキスト処理理
• ⾃自然⾔言語上で型を意識した表現はしない
• なぜなら⼈人の思考の中ではそのデータを数
値として扱うか⽂文(の⼀一部)として扱うかは⽂文
脈により⼀一意に決定されるから
• モノが0個なら無い、1個や2個ならある、っ
て判断は真偽値コンテキストじゃん?
たとえば年年齢
• 「100歳のおじいさん」だとか⼈人は書く
• ⽂文中だから100を⽂文字列列にしようとか考えない
けど⾃自然とやる
• 逆に、"100歳" がわかれば来年年は +1 して
"101歳" とか考えられる
• 同様のことをコード上で素直に表現するには?
たとえば年年齢
• $age . '歳のおじいさん'
• 「⽂文中なので年年齢は⽂文字列列として考えよう」
• $age + 1
• 「計算するんだから年年齢は数値として考えよう」
• つまりそれぞれの⽂文の中で$ageの型解釈が⾃自明
⾃自然⾔言語っぽい
データの解釈だと思いません?
⼈人間が簡単にデータを扱いたい
↓
⾃自然⾔言語のデータの扱い⽅方に合わせたい
↓
⽂文脈によって型が⾃自明になるようにしたい
↓
⽂文脈でデータ型を表現できる仕組みが必要
↓
コンテキストの誕⽣生?
Perlがコンテキストで解決したこと
• データの解釈を⾃自然⾔言語的にした
• Perlはデータ型やメモリなどを理理解せずとも
書ける
• システム運⽤用担当者などプログラミングに
明るくない⼈人にも優しい⾔言語になった
• 「簡単なことはより簡単に」の実践
解決しなかったこと
• データ型など⼀一般的なプログラミング⾔言語の
概念と結びつけにくい
• 柔軟な考え⽅方が苦⼿手な⼈人には少し難しい
• 処理理系実装の複雑さを招く⼀一因になった
• Cには当然コンテキストが存在しないので
Objectiveに同様の物を表現する必要がある
まとめ
まとめ
• コンテキストは分かれば簡単だけど最初は難しい
• ⾃自然⾔言語的な側⾯面があり、ルールが多い
• コンテキストはPerlの中⼼心になってる
• ちゃんと理理解するとPerlと仲良くなれる
• 各位、コンテキストと仲良く!
落ち葉拾拾い(というか⾔言い訳)
• あくまでも私⾒見見であり公式⾒見見解ではないよ
• LTなんで詳しい説明はしなかったよ
• 詳しく聞きたい⼈人は懇親会とかでも
• 分からなくてもPerl書いて良いんだよ
• 知ってると「より正しい」コードが書けるよ

コンテキストと仲良く