Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Perlでも関数の型をチェックしたい
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
ybrliiu
February 18, 2021
Programming
3.8k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Perlでも関数の型をチェックしたい
ybrliiu
February 18, 2021
More Decks by ybrliiu
See All by ybrliiu
これまでと、これからのPerlコミュニティ
ybrliiu
0
180
AstroNvim を使おう!
ybrliiu
0
5.5k
Perl5.32の新機能
ybrliiu
0
200
Vue.jsで作ったサイトをバニラJSで書き直す悲しいお話
ybrliiu
1
1.2k
Perlにおける動的なモジュールロードのメリットとデメリット
ybrliiu
0
930
黒魔術で独自定義のenum型制約を満たす値のリ ストを取得する話
ybrliiu
0
470
Perlにおけるクラスの実装パターン.pdf
ybrliiu
0
1.8k
Presentation.pdf
ybrliiu
0
310
ぼくがPerlで開発を行う時に工夫していること
ybrliiu
0
590
Other Decks in Programming
See All in Programming
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
410
巨大モノリシックアプリ モダン化大作戦
ktcryomm
0
170
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
690
週末にAI-DLCを本気で回したら$1,600溶けた
hbashimizu
0
130
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
890
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
1
270
Foundry Localでエージェント開発
seosoft
0
150
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
3
270
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
190
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
140
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
120
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
4
1.8k
Featured
See All Featured
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
KATA
mclloyd
PRO
35
15k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Darren the Foodie - Storyboard
khoart
PRO
3
3.9k
Become a Pro
speakerdeck
PRO
31
6.2k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
Marketing to machines
jonoalderson
1
5.8k
Bash Introduction
62gerente
615
220k
4 Signs Your Business is Dying
shpigford
187
23k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
45k
Color Theory Basics | Prateek | Gurzu
gurzu
0
460
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
370
Transcript
Perl でも関数の型をチェックしたい Japan.pm 2021 id: ybrliiu
自己紹介 • id: _ybrliiu / mp0liiu • 所属 : 株式会社モバイルファクトリー
• 普段はPerl書いています • 最近は古くなったフロントエンドの エコシステムをアップデートする仕事をしています
突然ですが 次のコードを見てどう思いますか?
None
インスタンス変数の型に サブルーチンリファレンスの型を指定
コールバックに渡される引数、 期待する返り値が何なのかわからん!
期待していないような値を返す コールバックが渡されたらどうしよう?
コールバック関数に型がついてほしい
このようになってほしい
このようになってほしい コールバックに渡される引数、 期待する返り値が明示されている
Perlにおける型制約事情 • 動的型付け言語なので型チェックは動的に行われる • 外部にインターフェースを公開する部分はしばしば型チェックが行われて いる ◦ インスタンス変数や関数の引数の型など ◦ 型制約を設けることによるメリットが多い
具体例 1. クラスビルダーによる型チェック 2. 引数バリデーターによる型チェック 3. 型制約ライブラリ
クラスビルダーによる型チェック • クラスビルダー ◦ オブジェクト指向関連の実装を簡単に記述できるライブラリ ◦ e.g.) C::A::L, Moose, Mouse,
Dios, Zydeco, etc... • 組み込みで型制約システムを持っているクラスビルダーがある • アトリビュートを作るとインスタンス変数の型をチェックしてくれる
Mooseによるインスタンス変数の型チェックの例
引数バリデーターによる型チェック • CPAN には引数をチェックする様々なモジュールがある ◦ e.g.) Params::Validate, Data::Validator, Smart::Args, Type::Params,
Function::Parameters etc... • クラスビルダー組み込みの型制約システムや、型制約ライブラリと組 み合わせて使うことで引数の型をチェックできる
Smart::Args による引数の型チェックの例
型制約ライブラリ • 型チェックする機能だけを提供するモジュール ◦ e.g.) Type::Tiny, Specio • 再利用性が高い •
最近は Type::Tiny とクラスビルダーや引数バリデーターと組み合わ せて使うことがトレンド • 同梱の Types::Standard で提供されている型でほとんどのユース ケースをカバーできる
Type::Tiny による型チェックの例
Perlの関数型の現状 • どの型制約ライブラリやクラスビルダーを探しても、コードリファレンス であるかをチェックする CodeRef 型しか存在しない • 関数の引数の型や返り値の型をチェック / 明示したくてもできない
◦ 他の型をしっかり書いていても関数の部分だけ割れ窓になる
ないなら実装するぞ!!!
実装するにあたって必要なもの • 関数の型情報を付与 / 取得できる仕組み • 2つの関数の型情報を比較する仕組み • 関数の型情報を比較する型
関数の型情報を付与 / 取得できる仕組みへの要求 • CodeRef の引数の型と返り値の型情報を付与し、それらをチェックす る • 後から引数の型と返り値の型情報を取得できるようにする •
引数の型と返り値の型情報は CodeRef のスコープが外れたら破棄 して欲しい • 実行時のオーバーヘッドをなるべく減らしたい
Sub::WrapInType の実装 • 前述の要求を満たすものがなかったので実装 • wrap_sub 関数に CodeRef、引数の型、返り値の型を与えると、与え られた CodeRef
を引数の型と返り値の型をチェックする処理でラップ したCodeRefを返す
Sub::WrapInType の利用例
• wrap_sub で生成される CodeRef は bless されたオブジェクト ◦ 関数の型の情報はスコープが外れたら破棄される ◦
CodeRef をそのまま実行できる ▪ ハッシュベースのクラスで演算子オーバーロードする場合と比 べてコード実行時のオーバーヘッドが少ない • Inside-out object というテクニックでクラスを実装 Sub::WrapInType の実装
実装するにあたって必要なもの • 関数の型情報を付与 / 取得できる仕組み • 2つの関数の型情報を比較する仕組み • 関数の型情報を比較する型
2つの関数の型情報を比較する仕組み Sub::Meta を利用する
実装するにあたって必要なもの • 関数の型情報を付与 / 取得できる仕組み • 2つの関数の型情報を比較する仕組み • 関数の型情報を比較する型
関数の型情報を比較する型の実装 • Sub::WrapInType で関数の型の情報を付与した CodeRef を Sub::Meta で比較する型を実装する • ポータビリティを考慮し
Type::Tiny で型を実装する ◦ 様々なクラスビルダーや引数バリデーターと組み合わせて利用で きる
Type::Tiny での独自型の実装 • Type::Tiny のコンストラクタに値をチェックする処理、親にあたる型、 型名、型強制する場合の処理などを渡して実装する ◦ Type::Utils のユーティリティ関数を用いれば簡単 •
型オブジェクトを返す関数を作ってエクスポートする ◦ Type::Library を利用すると簡単
Type::Tiny での独自型の実装例
総称型 • 関数の型情報を比較する型は関数の型情報をパラメータにとる総称 型になる • 総称型とは ◦ 抽象化された型で、型パラメータを渡すと具体化する ◦ Type::Tiny
でいう ArrayRef[T], HashRef[T] など
Type::Tiny での総称型の実装 • 独自の総称型を簡単に実装できるユーティリティは存在しない • 型パラメータが渡されたとき型名、型制約、型強制がどのように具体化 されるかを定義する ◦ name_generator, constraint_generator,
coercion_generator • 上記のパラメータを Type::Tiny に渡してインスタンスを生成 • 型パラメータリストを ArrayRef で取り型を具体化する関数を作る
Type::Tiny での総称型の実装例
Type::Tiny での総称型の実装例
Type::Tiny での総称型の実装例
実装するにあたって必要なもの • 関数の型情報を付与 / 取得できる仕組み • 2つの関数の型情報を比較する仕組み • 関数の型情報を比較する型
関数の型をチェックする型 Types::TypedCodeRef が完成!
Perlで関数の型チェックを実現
この型を使って最初のコードを書き換え てみましょう
None
どんなコールバック関数を渡せばいいかひ と目でわかる!!!
型強制もできる
型強制もできる CodeRef を渡すと Types::TypedCodeRef の型情報を使い Sub::WrapInType でラップしてくれる
DEMO
今後の展望 • inline 化してパフォーマンス良くしたい ◦ 型チェックするコードを文字列化して結合し eval することで、関数 呼び出しのオーバーヘッドがなくなる •
エラーメッセージをわかりやすくしたい ◦ 現状急に「型チェックに失敗した!」みたいなエラーがでてくるの で何が原因でエラーになったのかわかりにくい
まとめ
Types::TypedCodeRef で コールバックの型をつけよう!
Any Questions?