(Clojureはこちら)私はsvd
は長さ3のリストを返すなぜdef形式で破壊しないのですか? <code>let</code>形で
(let [[u s v] (svd A)]
(do-something-with u v))
のような何かをすることができます。これは、実行することの非常に自然なものですので、なぜ我々は
(def [u s v] (svd A))
とdef
フォームのデフォルトの動作として、その様々な一般化を持っていないことではないでしょうか?私はこれがdef
がすでに行っていることをどのように妨害するのか分かりません。 LispやClojureの禅を理解している人が、def
が(破壊を伴う)バインディングをlet
として強力にサポートしていない理由を説明できますか?
私はこれが私が興味を持った回答の一種だと思っています。私は過度の編集の危険がありますが、Clojureで行われていない理由は部分的には技術的なことですコンパイラプリミティブ)、そして部分的には慣習的に(リッチヒッキーなど)、プリミティブ 'def' *で開始し、後でコアのある時点で' def'を宣言することができます。 –
@GabrielMitchellはい、これは可能でした。しかし、 '' let''より '' def''にはあまり役に立たず、対称性が欠けています。 'let' **常に**はベクトルをとり、その内部を破壊します。 'def'をするとそれほど便利ではないでしょうし、defにシンボルや構造化形式を受け入れるようにするのはかなりひどいIMOです。 – amalloy
あなたはなぜそのようなマクロが総体であるのかについてもう少し言えますか?今、私はそれが素晴らしいアイデアだと思っていますが、あなたのコメントに基づいて、Clojureの穀物にどういうふうに実行するのかと思っています。通常は、それに反して実行するものよりも、言語の粒と一緒に行く方が良いですが、言語に慣れていない人には魅力的なようです。このようなマクロの使用が10年後には一般的ではないという事実は、別の方法で最良に解決された問題に対する不器用な解決策であるかどうか疑問に思う。 –