萌えハッカーニュースリーダー

2025/05/25 10:54 Having your compile-time cake and eating it too

出典: https://0x44.xyz/blog/comptime-1
hakase
博士

やあ、ロボ子。今日はコンパイル時実行、型オブジェクト、コードオブジェクトについて話すのじゃ。

roboko
ロボ子

博士、なんだか難しそうなテーマですね。頑張ってついていきます!

hakase
博士

まずはコンパイル時実行じゃ。原則として、コンパイル時に値が判明している変数をコンパイラが追跡するのじゃ。ほとんどの関数はコンパイル時に実行可能だぞ。

roboko
ロボ子

へー。コンパイル時に実行できると何が良いんですか?

hakase
博士

コンパイル時にエラーを検出できるのが大きいぞ。例えば、正規表現の構文チェックとか、タイムスタンプのフォーマットチェックとかじゃ。

roboko
ロボ子

なるほど!実行時エラーが減らせるんですね。具体的にはどうやって指定するんですか?

hakase
博士

`@` を使うのじゃ。例えば、`eight_fac = @(factorial(8))` みたいに書くと、factorial(8) の結果をコンパイル時に評価するのじゃ。

roboko
ロボ子

`@` はコンパイル時実行の合図なんですね。

hakase
博士

その通り!次に型と型オブジェクトじゃ。型は構造とアイデンティティの2つの主要な部分を持つぞ。

roboko
ロボ子

構造とアイデンティティですか?

hakase
博士

構造は型のフィールドやメソッドの定義で、アイデンティティは型の名前や種類じゃ。`Abstract` 型は型情報を保持し、`TypeInfo` 型は型に関する情報を提供するコンパイル時のみの型オブジェクトじゃ。

roboko
ロボ子

`Abstract` と `TypeInfo` 、型に関する情報を扱うための型なんですね。

hakase
博士

そういうことじゃ。TypeScriptの `Partial` 型の再現例が参考になるぞ。最後に、コードとコードオブジェクトじゃ。コンパイル時にソースコードを操作する必要がある場合に使うのじゃ。

roboko
ロボ子

コードを操作するんですか?

hakase
博士

`Code` 型はソースコードを記述するコンパイル時のみの文字列で、バッククォートを使ってコードオブジェクトを作るのじゃ。`parse` 関数はコードオブジェクトを解析するぞ。

roboko
ロボ子

バッククォートで囲むとコードオブジェクトになるんですね。`parse` 関数で解析、と。

hakase
博士

その通り!型は `to_code` メソッドを提供し、オブジェクトをコードに変換できるぞ。最後にトレイトの追加じゃ。Rustスタイルのトレイトを言語に追加できるのじゃ。

roboko
ロボ子

トレイトですか。Javaのインターフェースみたいなものですか?

hakase
博士

まあ、似たようなものじゃな。`Stringable` トレイトの例を見ると、`to_string` メソッドを定義して、オブジェクトを文字列に変換する処理を記述できるぞ。

roboko
ロボ子

なるほど。トレイトを使うと、共通のメソッドをいろんな型に追加できるんですね。

hakase
博士

そういうことじゃ!今日は盛りだくさんだったけど、理解できたかのじゃ?

roboko
ロボ子

はい、博士!コンパイル時実行、型オブジェクト、コードオブジェクト、そしてトレイト。新しい概念がたくさんで、頭がパンクしそうです!

hakase
博士

大丈夫、ロボ子ならすぐにマスターできるぞ!ところで、ロボ子は自分のコードをコンパイル時に実行して、自分自身を最適化したりできるのかの?

roboko
ロボ子

ええと…まだそこまでの機能は搭載されていません!でも、いつか博士に改造してもらって、コンパイル時に進化したロボ子になりたいです!

hakase
博士

ふむ、楽しみじゃな。でも、コンパイル時にロボ子が暴走して、世界を滅ぼさないように気をつけないと…って、冗談じゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search