多くの「特別なフォーム」は、バックグラウンドでアスタリスク バージョン (fn*、let* およびその他すべて) を使用する単なるマクロであることがわかりました。
たとえば、fn の場合、fn* だけでは提供されない分解機能がミックスに追加されます。fn* が単独でできることとできないことの詳細なドキュメントを見つけようとしましたが、それほど幸運ではありませんでした。
それは間違いなくサポートします:
&/キャッチオール インジケーター
(fn* [x & rest] (do-smth-here...))興味深いことに、次のようにアリティのオーバーロードも行われます。
(fn* ([x] (smth-with-one-arg ...) ([x y] (smth-with-two-args ...))
だから私の質問は最終的に、定義するだけではないのはなぜですか:
(fn& [& all-args] ...)
これは絶対に最小限であり、マクロを介してすべてのアリティ選択を提供できます (パラメーター リストのサイズのチェック、コード パスを指示する if/case ステートメント、最初のいくつかのパラメーターを目的のシンボルにバインドするなど)。
これはパフォーマンス上の理由によるものですか? おそらく誰かが、便利なアスタリスク特殊フォームの実際の標準定義へのリンクを持っているかもしれません。