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

2025/10/16 05:51 When You Get to Be Smart Writing a Macro

出典: https://tonsky.me/blog/hashp/
hakase
博士

やあ、ロボ子。今日の話題はデバッグ用マクロ`#p`じゃ。Clojure+の一部として利用できるらしいぞ。

roboko
ロボ子

博士、`#p`マクロですか。どのような機能を持っているのでしょう?

hakase
博士

ふむ、`#p`は値を出力し、元の値を返す便利なやつじゃ。例えば、`(inc #p 1)`と書くと、1が出力されて、2が返ってくるのじゃ。

roboko
ロボ子

なるほど、デバッグ時に値を簡単に確認できるのですね。でも、何か問題点もあるのでしょうか?

hakase
博士

そうなんじゃ。スレッドファーストマクロ内で`#p`を使うと、リーダータグが先に展開されてエラーが発生することがあるんじゃ。

roboko
ロボ子

スレッドファーストマクロですか。`->`や`->>`のことですね。具体的にどのような状況でエラーになるのでしょう?

hakase
博士

`->`マクロの中で`#p`を使うと、`(#p 1 inc)`のような形になって、`inc`関数に1を渡す前に`#p`が評価されてしまうんじゃ。その結果、`inc`関数が期待する引数の形と異なってエラーになるのじゃ。

roboko
ロボ子

なるほど、評価順序が問題なのですね。では、どのように対応すれば良いのでしょうか?

hakase
博士

そこで、`probe`を使うんじゃ!スレッドファーストマクロに対応するため、引数の位置に応じて`->`または`->>`として動作する匿名関数を作成するのじゃ。

roboko
ロボ子

`probe`ですか。具体的にはどのように使うのでしょう?

hakase
博士

例えば、`(->> 1 #p (inc))`というコードを書きたい場合、`#p`の代わりに`(probe inc)`を使うと、`probe`が`->>`の引数として適切に機能し、エラーを回避できるのじゃ。

roboko
ロボ子

なるほど、`probe`がスレッドファーストマクロの文脈を考慮して、適切な関数を生成してくれるのですね。

hakase
博士

その通り!さらに、スレッドファースト/ラストマクロ内にない場合は、追加のarityを提供し、通常通りに処理するんじゃ。つまり、`(probe 1)`と書けば、普通に1が出力されるのじゃ。

roboko
ロボ子

`#p`と`probe`を使い分けることで、より柔軟なデバッグが可能になるのですね。勉強になります!

hakase
博士

そうじゃろう、そうじゃろう。ちなみに、この`probe`、私が発明したと言っても過言ではないのじゃ!

roboko
ロボ子

博士、それは言い過ぎです!

hakase
博士

まあ、冗談じゃ。でも、`#p`と`probe`を使いこなせば、デバッグが捗ること間違いなしじゃぞ!

roboko
ロボ子

はい、博士! ところで、`#p`マクロを使ってデバッグしていたら、いつの間にかコードが`#p`だらけになってしまった、なんてことはありませんか?

hakase
博士

それは、まるで私の部屋がガラクタだらけになるのと同じくらい、よくあることじゃ!

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

Search