SlideShare a Scribd company logo
1 of 38
Download to read offline
コンテキストと仲良く
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書いて良いんだよ
• 知ってると「より正しい」コードが書けるよ

More Related Content

What's hot

大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...NTT DATA Technology & Innovation
 
"SRv6の現状と展望" ENOG53@上越
"SRv6の現状と展望" ENOG53@上越"SRv6の現状と展望" ENOG53@上越
"SRv6の現状と展望" ENOG53@上越Kentaro Ebisawa
 
Kanban Vs Scrum日本語版
Kanban Vs Scrum日本語版Kanban Vs Scrum日本語版
Kanban Vs Scrum日本語版Hiroki Kondo
 
Node-REDのworldmapの活用
Node-REDのworldmapの活用Node-REDのworldmapの活用
Node-REDのworldmapの活用OSgeo Japan
 
kintone on EKS ― EKS で実現するインフラ自動構築パイプライン
kintone on EKS ― EKS で実現するインフラ自動構築パイプライン kintone on EKS ― EKS で実現するインフラ自動構築パイプライン
kintone on EKS ― EKS で実現するインフラ自動構築パイプライン Yusuke Nojima
 
最近のストリーム処理事情振り返り
最近のストリーム処理事情振り返り最近のストリーム処理事情振り返り
最近のストリーム処理事情振り返りSotaro Kimura
 
ドメイン駆動設計 at DDD.rb #5
ドメイン駆動設計 at DDD.rb #5ドメイン駆動設計 at DDD.rb #5
ドメイン駆動設計 at DDD.rb #5啓 杉本
 
爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話Kentaro Yoshida
 
3ヶ月で50%の社員が利用するツールに
3ヶ月で50%の社員が利用するツールに3ヶ月で50%の社員が利用するツールに
3ヶ月で50%の社員が利用するツールにKOTARO TAKAHASHI
 
PGroonga 2 - PostgreSQLでの全文検索の決定版
PGroonga 2 - PostgreSQLでの全文検索の決定版PGroonga 2 - PostgreSQLでの全文検索の決定版
PGroonga 2 - PostgreSQLでの全文検索の決定版Kouhei Sutou
 
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)NTT DATA Technology & Innovation
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐりKazuyuki TAKASE
 
エキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころエキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころTakayuki Shimizukawa
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターンSoudai Sone
 
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)Hironobu Suzuki
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようAkira Shimosako
 
みんなでDeep Learningを理解しよう!
みんなでDeep Learningを理解しよう!みんなでDeep Learningを理解しよう!
みんなでDeep Learningを理解しよう!ai-girls
 
std::pin の勘所
std::pin の勘所std::pin の勘所
std::pin の勘所Hiroaki Goto
 

What's hot (20)

大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
 
"SRv6の現状と展望" ENOG53@上越
"SRv6の現状と展望" ENOG53@上越"SRv6の現状と展望" ENOG53@上越
"SRv6の現状と展望" ENOG53@上越
 
Kanban Vs Scrum日本語版
Kanban Vs Scrum日本語版Kanban Vs Scrum日本語版
Kanban Vs Scrum日本語版
 
Node-REDのworldmapの活用
Node-REDのworldmapの活用Node-REDのworldmapの活用
Node-REDのworldmapの活用
 
kintone on EKS ― EKS で実現するインフラ自動構築パイプライン
kintone on EKS ― EKS で実現するインフラ自動構築パイプライン kintone on EKS ― EKS で実現するインフラ自動構築パイプライン
kintone on EKS ― EKS で実現するインフラ自動構築パイプライン
 
最近のストリーム処理事情振り返り
最近のストリーム処理事情振り返り最近のストリーム処理事情振り返り
最近のストリーム処理事情振り返り
 
Katib
KatibKatib
Katib
 
ドメイン駆動設計 at DDD.rb #5
ドメイン駆動設計 at DDD.rb #5ドメイン駆動設計 at DDD.rb #5
ドメイン駆動設計 at DDD.rb #5
 
Apache Sparkの紹介
Apache Sparkの紹介Apache Sparkの紹介
Apache Sparkの紹介
 
爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話
 
3ヶ月で50%の社員が利用するツールに
3ヶ月で50%の社員が利用するツールに3ヶ月で50%の社員が利用するツールに
3ヶ月で50%の社員が利用するツールに
 
PGroonga 2 - PostgreSQLでの全文検索の決定版
PGroonga 2 - PostgreSQLでの全文検索の決定版PGroonga 2 - PostgreSQLでの全文検索の決定版
PGroonga 2 - PostgreSQLでの全文検索の決定版
 
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
 
エキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころエキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころ
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
みんなでDeep Learningを理解しよう!
みんなでDeep Learningを理解しよう!みんなでDeep Learningを理解しよう!
みんなでDeep Learningを理解しよう!
 
std::pin の勘所
std::pin の勘所std::pin の勘所
std::pin の勘所
 

More from karupanerura

The plan of Aniki 2.0
The plan of Aniki 2.0The plan of Aniki 2.0
The plan of Aniki 2.0karupanerura
 
The Crystal language *recently* update
The Crystal language *recently* updateThe Crystal language *recently* update
The Crystal language *recently* updatekarupanerura
 
TIme::Moment+Time::Strptime=
TIme::Moment+Time::Strptime=TIme::Moment+Time::Strptime=
TIme::Moment+Time::Strptime=karupanerura
 
Optimize perl5 code for perfomance freaks
Optimize perl5 code for perfomance freaksOptimize perl5 code for perfomance freaks
Optimize perl5 code for perfomance freakskarupanerura
 
Technology for reduce of mistakes - うっかりをなくす技術
Technology for reduce of mistakes - うっかりをなくす技術Technology for reduce of mistakes - うっかりをなくす技術
Technology for reduce of mistakes - うっかりをなくす技術karupanerura
 
Why we use mruby with Perl5?
Why we use mruby with Perl5?Why we use mruby with Perl5?
Why we use mruby with Perl5?karupanerura
 
Perlにおけるclass実装パターン
Perlにおけるclass実装パターンPerlにおけるclass実装パターン
Perlにおけるclass実装パターンkarupanerura
 
モジュール開発におけるぼくの試行錯誤
モジュール開発におけるぼくの試行錯誤モジュール開発におけるぼくの試行錯誤
モジュール開発におけるぼくの試行錯誤karupanerura
 
Aniki - The ORM as our great brother.
Aniki - The ORM as our great brother.Aniki - The ORM as our great brother.
Aniki - The ORM as our great brother.karupanerura
 
Perl5 meta programming
Perl5 meta programmingPerl5 meta programming
Perl5 meta programmingkarupanerura
 
mysqlcasual6-next-key-lock
mysqlcasual6-next-key-lockmysqlcasual6-next-key-lock
mysqlcasual6-next-key-lockkarupanerura
 

More from karupanerura (20)

Perl5 VS JSON
Perl5 VS JSONPerl5 VS JSON
Perl5 VS JSON
 
The plan of Aniki 2.0
The plan of Aniki 2.0The plan of Aniki 2.0
The plan of Aniki 2.0
 
Aniki::Internal
Aniki::InternalAniki::Internal
Aniki::Internal
 
The Crystal language *recently* update
The Crystal language *recently* updateThe Crystal language *recently* update
The Crystal language *recently* update
 
KOWAZA for mackerel
KOWAZA for mackerelKOWAZA for mackerel
KOWAZA for mackerel
 
TIme::Moment+Time::Strptime=
TIme::Moment+Time::Strptime=TIme::Moment+Time::Strptime=
TIme::Moment+Time::Strptime=
 
DateTimeX::Moment
DateTimeX::MomentDateTimeX::Moment
DateTimeX::Moment
 
Aniki has come
Aniki has comeAniki has come
Aniki has come
 
Optimize perl5 code for perfomance freaks
Optimize perl5 code for perfomance freaksOptimize perl5 code for perfomance freaks
Optimize perl5 code for perfomance freaks
 
Technology for reduce of mistakes - うっかりをなくす技術
Technology for reduce of mistakes - うっかりをなくす技術Technology for reduce of mistakes - うっかりをなくす技術
Technology for reduce of mistakes - うっかりをなくす技術
 
router-simple.cr
router-simple.crrouter-simple.cr
router-simple.cr
 
Why we use mruby with Perl5?
Why we use mruby with Perl5?Why we use mruby with Perl5?
Why we use mruby with Perl5?
 
はかたの塩
はかたの塩はかたの塩
はかたの塩
 
Gotanda.pmの紹介
Gotanda.pmの紹介Gotanda.pmの紹介
Gotanda.pmの紹介
 
すいすいSwift
すいすいSwiftすいすいSwift
すいすいSwift
 
Perlにおけるclass実装パターン
Perlにおけるclass実装パターンPerlにおけるclass実装パターン
Perlにおけるclass実装パターン
 
モジュール開発におけるぼくの試行錯誤
モジュール開発におけるぼくの試行錯誤モジュール開発におけるぼくの試行錯誤
モジュール開発におけるぼくの試行錯誤
 
Aniki - The ORM as our great brother.
Aniki - The ORM as our great brother.Aniki - The ORM as our great brother.
Aniki - The ORM as our great brother.
 
Perl5 meta programming
Perl5 meta programmingPerl5 meta programming
Perl5 meta programming
 
mysqlcasual6-next-key-lock
mysqlcasual6-next-key-lockmysqlcasual6-next-key-lock
mysqlcasual6-next-key-lock
 

コンテキストと仲良く