問題タブ [let]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
676 参照

clojure - Clojure の「let」に混乱

Clojure をいじり始めたばかりで、いくつかの機能を理解するのに役立つ簡単なスクリプトを作成しました。次のように始まります。

次に、 を通過し*exprs-to-test*、それらすべてを評価して、出力を次のように出力します。

上記のコードはすべて正常に動作しています。ただし、繰り返されるので、次のように繰り返しをなくすため(read-string exstr)に使用しようとしました:let

しかし、これは の最初の項目に対して 1 回機能し*exprs-to-test*、その後NullPointerException. letクラッシュの原因の追加はなぜですか?

0 投票する
6 に答える
31095 参照

lambda - スキームのラムダのポイントは何ですか?

私はスキームを学んでいます。ラムダ式とレット式の両方を使用する方法を知っています。

ただし、ラムダを使用することのポイントを理解するのに苦労しています。ラムダでできることをletですべて行うことはできませんか?

ラムダ式がletよりも優れた選択である状況の例を見ると特に役立ちます。

もう1つ-ラムダよりもletの方が便利な状況もありますか?もしそうなら、そのような例もいいでしょう。

編集:defineとlambdaは同様のタスクを実行しているように見えるので、それらを対比することにも興味があります。


アップデート:

みんな助けてくれてありがとう。私はあなたの答えを読んだ後、ラムダ/レット/定義をもう少し調べました、そして今それをもっとよく理解しています。

クールなラムダの使用法の優れた例に出くわしました-プロシージャから無名関数を返します。たとえば、operateTwice以下のプロシージャは、プロシージャに渡されたパラメータに基づく無名関数を返します。

出力:

0 投票する
3 に答える
903 参照

lambda - 内部再帰プロシージャの名前付けに「let」が機能しないのはなぜですか?

階乗を計算する関数の次の実装を考えてみましょう: [1]

let内部定義を使用して書き直そうとしました:

その時点でエラーはありませんdefineが、実行結果は次のようになります。

letバージョンを機能させるにはどうすればよいですか?

スキームのバージョンは SISC v 1.16.6 です

[1] SICP http://mitpress.mit.edu/sicp/full-text/book/book-ZH-11.html#%_sec_1.2.1factorialのセクション 1.2.1 の反復バージョンに基づく

0 投票する
5 に答える
2118 参照

macros - let がベクトルを必要とするのはなぜですか?

Clojure に慣れていない同僚に clojure コードを説明するまで、私はこれについて本当に考えたことはありませんでした。letリストではなくベクトルを使用してバインディングを宣言する理由を彼が尋ねたとき、私は彼に説明していました。私は彼に対して本当に答えがありませんでした。しかし、この言語ではリストの使用制限されています。

これはなぜですか?

0 投票する
1 に答える
270 参照

lisp - 一時変数を再作成するLisp

Lispに少し問題があります。私がやろうとしているのは、x個のリストに数字が表示される回数を追跡することです。ただし、これを何度も実行すると、lispは変数を再作成しませんが、最後に関数を呼び出したときの終了値を使用します。だから私はどうすればletの「拘束力のある」力を乗り越えることができるのだろうかと思っています。

だから、私はこのようないくつかのリストを持っています

次に、このような関数を呼び出しています(最初の関数呼び出しを過ぎて、ここでvarを宣言しても何も起こらないようです)...letから何らかのバインディングを推測します。

だから私は関数を通して私のリストを実行し、次のようなものを得ることができます

リストにある番号を参照する各位置。したがって、値8は、すべてのリストで1が見つかった回数を示します(2番目のリストのみを検討しています)。今問題....それを2回実行して...

以前は連想リストを使用していましたが、これを理解して物事を単純に保つために、現在はリストを使用しています。私が持っている別の質問は、どうすればその場で連想リスト要素を作成できるかということだと思います。私はそのように「var」を宣言するのは好きではありませんが、今のところ「let」を回避しようとしています。私は「setq」または「setf」のどちらにもあまり運がありませんでした...。

よろしくお願いします!

0 投票する
5 に答える
61428 参照

haskell - Haskell: Where と Let

私は Haskell を初めて使用し、WhereLetで非常に混乱しています。どちらも同様の目的を提供しているようです。WhereLetの比較をいくつか読んだことがありますが、それぞれをいつ使用するかを判断するのに苦労しています。誰かがコンテキストや、どちらを使用するかを示すいくつかの例を提供してもらえますか?

どことレット

where句は、関数定義のレベルでのみ定義できます。通常、それはlet定義の範囲と同じです。唯一の違いは、ガードが使用されている場合です。where句の範囲は、すべてのガードに及びます。対照的に、let式のスコープは、現在の関数句とガード (存在する場合) のみです。

Haskellチートシート

Haskell Wikiは非常に詳細で、さまざまなケースを提供していますが、仮説的な例を使用しています。初心者には説明が短すぎると思います。

Let の利点:

Control.Monad.State

where は f = に一致するパターンを参照し、x が範囲内にないため、機能しません。対照的に、let で開始した場合は、問題はありません。

Let の利点に関する Haskell Wiki

どこの利点

宣言と式

Haskell wiki では、 Where句は宣言的であり、Let式は表現的であると述べています。スタイルは別として、彼らはどのように異なるパフォーマンスを発揮しますか?

  1. 最初の例では、Letがスコープ内にあるのにWhereがそうでないのはなぜですか?
  2. 最初の例にWhereを適用することは可能ですか?
  3. 変数が実際の式を表す実際の例にこれを適用できる人はいますか?
  4. それぞれをいつ使用するかに従う一般的な経験則はありますか?

アップデート

後でこのスレッドにたどり着いた人のために、ここにある最良の説明を見つけました:「Haskellへの穏やかな紹介」。

式をしましょう。

Haskell の let 式は、ネストされたバインディングのセットが必要な場合に便利です。簡単な例として、次のことを考慮してください。

let 式によって作成されたバインディングのセットは相互に再帰的であり、パターン バインディングは遅延パターンとして扱われます (つまり、暗黙の ~ を持ちます)。許可される宣言の種類は、型シグネチャ、関数バインディング、およびパターン バインディングのみです。

Where 条項。

where 句を必要とするいくつかの保護された方程式にバインディングのスコープを設定すると便利な場合があります。

これは、let 式では実行できないことに注意してください。let 式は、囲まれている式のみをスコープします。where 句は、一連の方程式またはケース式の最上位でのみ使用できます。let 式のバインディングに対する同じプロパティと制約が、where 句のバインディングにも適用されます。ネストされたスコープのこれら 2 つの形式は非常に似ているように見えますが、let 式は式であるのに対し、where 句はそうではないことに注意してください。これは、関数宣言とケース式の構文の一部です。

0 投票する
6 に答える
4247 参照

scala - Clojureの「let」に相当するScala

私はしばしば次の状況に直面します:私がこれらの3つの機能を持っていると仮定します

そして私にもcalculate機能があります。私の最初のアプローチは次のようになります。

見た目は美しく、中括弧はありません。1つの表現だけです。しかし、それは最適ではないので、私はこのコードになります:

これで、中括弧で囲まれたいくつかの式になりました。そのような瞬間、私はClojureを少しうらやましく思います。let関数を使用すると、この関数を1つの式で定義できます。

したがって、ここでの私の目標はcalculate、1つの式で関数を定義することです。私は2つの解決策を考え出します。

1- scalazを使用すると、次のように定義できます(scalazを使用してこれを行うためのより良い方法はありますか?):

このソリューションについて私が気に入らないのは、ネストされていることです。私が持っているほどval、この入れ子は深くなります。

2-for理解することで、私は似たようなことを達成することができます:

このソリューションはlet、Clojureと同じようにフラットな構造になっていますが、関数の結果をラップして結果Optionを受け取る必要があります(nullを処理しているのは良いことですが、そうではありません。 。そしてしたく​​ない)。Optioncalculate

私の目標を達成するためのより良い方法はありますか?そのような状況に対処するための慣用的な方法は何ですか(私はvalsにとどまる必要があるかもしれません...しかしletそれを行う方法はとてもエレガントに見えます)?

一方、それは参照透過性に接続されています。3つの関数はすべて参照透過性であるため(私の例ではfirstFnPiのような定数を計算します)、理論的には計算結果に置き換えることができます。私はこれを知っていますが、コンパイラーは知らないので、最初の試みを最適化することはできません。そして、これが私の2番目の質問です。

どういうわけか(注釈付きの場合もあります)、関数が参照透過性であるというヒントをコンパイラに与えて、この関数を最適化できるようにすることはできますか(たとえば、ある種のキャッシュをそこに置く)?

編集

素晴らしい答えをありがとうございました!最良の答えを1つ選ぶのは不可能です(すべてがとても良いからかもしれません)ので、私は最も多くの賛成票で答えを受け入れます、それは十分に公平だと思います。

0 投票する
2 に答える
971 参照

linq - 範囲を設定するLINQ

LINQ式を使用してこの2番目の部分(for / foreach)を実行する方法がわかりません。また、LINQを使用した同様の例は見つかりませんでした。rangeDaysは約5から200の間であり、q1はRowIDがギャップなしで約10000から25000であるMyClassesのリストです。

前もって感謝します。


更新:以下に示すように、2つのlinqステートメントでこれを実行しました(今回はすべて実行可能であるといいのですが)。

これは許容できますが、次の単一のステートメントがNotSupportedExceptionをスローする理由を誰もが知っています。「ローカルシーケンスは、Contains演算子を除くクエリ演算子のLINQtoSQL実装では使用できません。」コンパイルして実行しようとすると:

0 投票する
1 に答える
2913 参照

lambda - スキームで let をラムダ関数として実装する方法

演習として、let を次のようなラムダ関数として定義しようとしています。

そして、私はそれを次のように呼ぶことを望んでいます:

ただし、バインドされていない変数 (この場合は "a") を引数として関数に渡す方法はありません。(少し奇妙に見えますが、関数を返すには let_as_lambda(var) が必要です。)

誰でもこれを行う方法を教えてもらえますか? アドバイスをいただければ幸いです。

実際、このラムダに相当する式を使用するだけです:

これを機能させることさえできません:

呼び出し元:(let_as_lambda a 3 (+ a 2))

同じ苦情を受けずに:

定義前の識別子への参照: a

0 投票する
2 に答える
267 参照

scheme - スキームは let* をネストされた単項 let として書き直します

一致が見つからない場合に引数を返すことを除いて、match-rewriter基本的には関数を作成しました。match-lambda

match-rewriterここで、ソース コードを表す文字列を取得let*し、ネストされた unary として書き直すために使用したいと思いますlets

これをパターンマッチする方法に本当に困惑しています。戻る必要があります:

しかし、ネスティングは私を困惑させました。アドバイスをいただければ幸いです。


さて、これが私の最善の試みです:

しかし、これはそれがどのように動作するかです:

(let*→nested-unary-lets '(let* ((a 1) (b (+ a 1)) (c (+ ab))) (displayln c))) '(let ((a 1) (let *→nested-unary-lets '(let* (((bc) ((+ a 1) (+ ab))) ...) (displayln c)))))

次の引数の順序について混乱しています。

私には次のように思われます:

また、let*→nested-unary-letsテキストとして出力するだけでなく、 への呼び出しが実行されると便利です。