この の使用_
は純粋に慣習的なものです。Clojure の観点からは、ローカルの名前を付けるために使用できる通常のシンボルにすぎません。したがって、 の値を_
直接確認して、理解を確認することができます。
(let [[x _ _ [y z]] v]
_)
;= 99.2
内部で何が起こっているかについては、それを確認する最も簡単な方法は、let
フォームをマクロ展開することです。
(macroexpand-1 '(let [[x _ _ [y z]] v] _))
上記の結果をわかりやすくするために再フォーマットすると、次のようになります。
(let* [vec__7 v
x (clojure.core/nth vec__7 0 nil)
_ (clojure.core/nth vec__7 1 nil)
_ (clojure.core/nth vec__7 2 nil)
vec__8 (clojure.core/nth vec__7 3 nil)
y (clojure.core/nth vec__8 0 nil)
z (clojure.core/nth vec__8 1 nil)]
_)
したがって、2 番目_
は単純に最初のものをシャドウします。
let*
の背後にある実装の詳細let
です。これは、let
マクロが分解サポートを追加するコンパイラによって直接認識される特別な形式です。