elispでの「let *」(アスタリスクを使用)の意味


11

私が使ってきたlet前に、しかし、使ったことがないlet* 何をするかlet*のelispに意味(アスタリスクを聞かせて)?

これはアスタリスクのためグーグルするのは困難でした。

回答:


16

つまり、複数のバインディングがある場合、変数は順次バインドされるため、それぞれがその前にバインドされている値にバインドされている値、つまりlet*バインディング内でその前にある値に依存することができます。

let(アスタリスク)、バインディングのいずれもが、他のいずれかの前に発生すると仮定することはできない(変数は、原則的に、並列にバインドすることができます)。

したがって、の値(let ((a 42) (b a))...b)にバインドしようとするためにエラーが発生する可能性がbありaa(少なくともathisにバインドされている特定のlet)値にバインドされていると想定することはできません。

[他の(たとえばグローバル)変数a が値(たとえば)にバインドされている場合、5そのlet式はその(ローカル)aをグローバルの値(つまり。)に42バインドbしてバインドします。a5

しかしにバインドされてからの値にバインドされるため、(let* ((a 42) (b a))...b)戻ります。42a42 ba

Elispマニュアルのノードローカル変数を参照してください。


コメント内の@ DoMiNeLa10のリマインダーからの更新:

マニュアルに加えて、ヘルプコマンドも使用できます「Emacsに尋ねる」ためのさまざまな方法の中で、それらは最初に学び、最も役立つものの1つです。

そして、C-h f let*私たちに言うと、簡潔に:Each VALUEFORM can refer to the symbols already bound by this VARLIST.


ここで質問することに何の問題もありませんが、Emacsにそのような質問をした場合は、あなた自身に有利になります。を使用して、マニュアルの情報ブラウザを開き、マニュアルを選択し、を使用してインデックスを検索します(補完あり)。これにより、これをカバーするノードに直接移動します。C-h iElispi let*let*

(そして、マニュアルは通常、ここで行われるよりも優れたものをカバーしています。何千人もの貢献者による多くの時間と労力がそれを正しくすることに費やしてきたためです:正確で完全です。)


このサイトでタグを使用した質問と回答を検索することもできます。検索フィールドに入力するlet-bindingだけ[let-binding]です。(今、この質問がおそらく重複しているかどうかを確認するためにそれを行います...)


上記の例でbは、5 に等しいとタイプミスがありaます。これは、globalにバインドされているためです。let代わりに読む必要がありますlet*
jue

@jue:そうです。THX。
ドリュー

で関数について尋ねることも可能F1 fです。
DoMiNeLa10 2018

@ DoMiNeLa10:確かに; いい視点ね。コメントはいつでも削除できるので、これについて言及するために回答を更新しました。THX。
ドリュー

4

let*再帰的なlet意味のようです:

(let* ((var1 VAL1)
       (var2 VAL2))
  ...)

のようなものです

(let ((var1 VAL1))
  (let ((var2 VAL2))
    ...))

これにより、との大文字の使用は、それらが式であることもできることVAL1VAL2示します。

再帰的なletバインディングは、VAL2実際にに依存している場合に影響がありますvar1。効果はすでにDrewの回答に記載されています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.