Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Perlでも関数の型をチェックしたい
Search
ybrliiu
February 18, 2021
Programming
0
3.4k
Perlでも関数の型をチェックしたい
ybrliiu
February 18, 2021
Tweet
Share
More Decks by ybrliiu
See All by ybrliiu
これまでと、これからのPerlコミュニティ
ybrliiu
0
170
AstroNvim を使おう!
ybrliiu
0
4.9k
Perl5.32の新機能
ybrliiu
0
170
Vue.jsで作ったサイトをバニラJSで書き直す悲しいお話
ybrliiu
1
1.1k
Perlにおける動的なモジュールロードのメリットとデメリット
ybrliiu
0
880
黒魔術で独自定義のenum型制約を満たす値のリ ストを取得する話
ybrliiu
0
430
Perlにおけるクラスの実装パターン.pdf
ybrliiu
0
1.7k
Presentation.pdf
ybrliiu
0
280
ぼくがPerlで開発を行う時に工夫していること
ybrliiu
0
560
Other Decks in Programming
See All in Programming
S3 VectorsとStrands Agentsを利用したAgentic RAGシステムの構築
tosuri13
6
350
AIコーディングエージェント(skywork)
kondai24
0
180
ローカルLLMを⽤いてコード補完を⾏う VSCode拡張機能を作ってみた
nearme_tech
PRO
0
110
バックエンドエンジニアによる Amebaブログ K8s 基盤への CronJobの導入・運用経験
sunabig
0
160
sbt 2
xuwei_k
0
300
Graviton と Nitro と私
maroon1st
0
110
生成AIを利用するだけでなく、投資できる組織へ
pospome
2
350
Go コードベースの構成と AI コンテキスト定義
andpad
0
130
JETLS.jl ─ A New Language Server for Julia
abap34
1
420
MAP, Jigsaw, Code Golf 振り返り会 by 関東Kaggler会|Jigsaw 15th Solution
hasibirok0
0
250
TUIライブラリつくってみた / i-just-make-TUI-library
kazto
1
400
大体よく分かるscala.collection.immutable.HashMap ~ Compressed Hash-Array Mapped Prefix-tree (CHAMP) ~
matsu_chara
2
220
Featured
See All Featured
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
The Language of Interfaces
destraynor
162
25k
Statistics for Hackers
jakevdp
799
230k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
300
A Tale of Four Properties
chriscoyier
162
23k
Amusing Abliteration
ianozsvald
0
61
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
390
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
60
37k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.1k
ラッコキーワード サービス紹介資料
rakko
0
1.7M
Measuring & Analyzing Core Web Vitals
bluesmoon
9
710
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?