問題タブ [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.
clojure - Clojure の「let」に混乱
Clojure をいじり始めたばかりで、いくつかの機能を理解するのに役立つ簡単なスクリプトを作成しました。次のように始まります。
次に、 を通過し*exprs-to-test*
、それらすべてを評価して、出力を次のように出力します。
上記のコードはすべて正常に動作しています。ただし、繰り返されるので、次のように繰り返しをなくすため(read-string exstr)
に使用しようとしました:let
しかし、これは の最初の項目に対して 1 回機能し*exprs-to-test*
、その後NullPointerException
. let
クラッシュの原因の追加はなぜですか?
lambda - スキームのラムダのポイントは何ですか?
私はスキームを学んでいます。ラムダ式とレット式の両方を使用する方法を知っています。
ただし、ラムダを使用することのポイントを理解するのに苦労しています。ラムダでできることをletですべて行うことはできませんか?
ラムダ式がletよりも優れた選択である状況の例を見ると特に役立ちます。
もう1つ-ラムダよりもletの方が便利な状況もありますか?もしそうなら、そのような例もいいでしょう。
編集:defineとlambdaは同様のタスクを実行しているように見えるので、それらを対比することにも興味があります。
アップデート:
みんな助けてくれてありがとう。私はあなたの答えを読んだ後、ラムダ/レット/定義をもう少し調べました、そして今それをもっとよく理解しています。
クールなラムダの使用法の優れた例に出くわしました-プロシージャから無名関数を返します。たとえば、operateTwice
以下のプロシージャは、プロシージャに渡されたパラメータに基づく無名関数を返します。
出力:
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 の反復バージョンに基づく
macros - let がベクトルを必要とするのはなぜですか?
Clojure に慣れていない同僚に clojure コードを説明するまで、私はこれについて本当に考えたことはありませんでした。let
リストではなくベクトルを使用してバインディングを宣言する理由を彼が尋ねたとき、私は彼に説明していました。私は彼に対して本当に答えがありませんでした。しかし、この言語ではリストの使用が制限されています。
これはなぜですか?
lisp - 一時変数を再作成するLisp
Lispに少し問題があります。私がやろうとしているのは、x個のリストに数字が表示される回数を追跡することです。ただし、これを何度も実行すると、lispは変数を再作成しませんが、最後に関数を呼び出したときの終了値を使用します。だから私はどうすればletの「拘束力のある」力を乗り越えることができるのだろうかと思っています。
だから、私はこのようないくつかのリストを持っています
次に、このような関数を呼び出しています(最初の関数呼び出しを過ぎて、ここでvarを宣言しても何も起こらないようです)...letから何らかのバインディングを推測します。
だから私は関数を通して私のリストを実行し、次のようなものを得ることができます
リストにある番号を参照する各位置。したがって、値8は、すべてのリストで1が見つかった回数を示します(2番目のリストのみを検討しています)。今問題....それを2回実行して...
以前は連想リストを使用していましたが、これを理解して物事を単純に保つために、現在はリストを使用しています。私が持っている別の質問は、どうすればその場で連想リスト要素を作成できるかということだと思います。私はそのように「var」を宣言するのは好きではありませんが、今のところ「let」を回避しようとしています。私は「setq」または「setf」のどちらにもあまり運がありませんでした...。
よろしくお願いします!
haskell - Haskell: Where と Let
私は Haskell を初めて使用し、WhereとLetで非常に混乱しています。どちらも同様の目的を提供しているようです。WhereとLetの比較をいくつか読んだことがありますが、それぞれをいつ使用するかを判断するのに苦労しています。誰かがコンテキストや、どちらを使用するかを示すいくつかの例を提供してもらえますか?
どことレット
where
句は、関数定義のレベルでのみ定義できます。通常、それはlet
定義の範囲と同じです。唯一の違いは、ガードが使用されている場合です。where
句の範囲は、すべてのガードに及びます。対照的に、let
式のスコープは、現在の関数句とガード (存在する場合) のみです。
Haskell Wikiは非常に詳細で、さまざまなケースを提供していますが、仮説的な例を使用しています。初心者には説明が短すぎると思います。
Let の利点:
where は f = に一致するパターンを参照し、x が範囲内にないため、機能しません。対照的に、let で開始した場合は、問題はありません。
どこの利点:
Haskell wiki では、 Where句は宣言的であり、Let式は表現的であると述べています。スタイルは別として、彼らはどのように異なるパフォーマンスを発揮しますか?
- 最初の例では、Letがスコープ内にあるのにWhereがそうでないのはなぜですか?
- 最初の例にWhereを適用することは可能ですか?
- 変数が実際の式を表す実際の例にこれを適用できる人はいますか?
- それぞれをいつ使用するかに従う一般的な経験則はありますか?
アップデート
後でこのスレッドにたどり着いた人のために、ここにある最良の説明を見つけました:「Haskellへの穏やかな紹介」。
式をしましょう。
Haskell の let 式は、ネストされたバインディングのセットが必要な場合に便利です。簡単な例として、次のことを考慮してください。
let 式によって作成されたバインディングのセットは相互に再帰的であり、パターン バインディングは遅延パターンとして扱われます (つまり、暗黙の ~ を持ちます)。許可される宣言の種類は、型シグネチャ、関数バインディング、およびパターン バインディングのみです。
Where 条項。
where 句を必要とするいくつかの保護された方程式にバインディングのスコープを設定すると便利な場合があります。
これは、let 式では実行できないことに注意してください。let 式は、囲まれている式のみをスコープします。where 句は、一連の方程式またはケース式の最上位でのみ使用できます。let 式のバインディングに対する同じプロパティと制約が、where 句のバインディングにも適用されます。ネストされたスコープのこれら 2 つの形式は非常に似ているように見えますが、let 式は式であるのに対し、where 句はそうではないことに注意してください。これは、関数宣言とケース式の構文の一部です。
scala - Clojureの「let」に相当するScala
私はしばしば次の状況に直面します:私がこれらの3つの機能を持っていると仮定します
そして私にもcalculate
機能があります。私の最初のアプローチは次のようになります。
見た目は美しく、中括弧はありません。1つの表現だけです。しかし、それは最適ではないので、私はこのコードになります:
これで、中括弧で囲まれたいくつかの式になりました。そのような瞬間、私はClojureを少しうらやましく思います。let関数を使用すると、この関数を1つの式で定義できます。
したがって、ここでの私の目標はcalculate
、1つの式で関数を定義することです。私は2つの解決策を考え出します。
1- scalazを使用すると、次のように定義できます(scalazを使用してこれを行うためのより良い方法はありますか?):
このソリューションについて私が気に入らないのは、ネストされていることです。私が持っているほどval
、この入れ子は深くなります。
2-for
理解することで、私は似たようなことを達成することができます:
このソリューションはlet
、Clojureと同じようにフラットな構造になっていますが、関数の結果をラップして結果Option
を受け取る必要があります(nullを処理しているのは良いことですが、そうではありません。 。そしてしたくない)。Option
calculate
私の目標を達成するためのより良い方法はありますか?そのような状況に対処するための慣用的な方法は何ですか(私はval
sにとどまる必要があるかもしれません...しかしlet
それを行う方法はとてもエレガントに見えます)?
一方、それは参照透過性に接続されています。3つの関数はすべて参照透過性であるため(私の例ではfirstFn
Piのような定数を計算します)、理論的には計算結果に置き換えることができます。私はこれを知っていますが、コンパイラーは知らないので、最初の試みを最適化することはできません。そして、これが私の2番目の質問です。
どういうわけか(注釈付きの場合もあります)、関数が参照透過性であるというヒントをコンパイラに与えて、この関数を最適化できるようにすることはできますか(たとえば、ある種のキャッシュをそこに置く)?
編集
素晴らしい答えをありがとうございました!最良の答えを1つ選ぶのは不可能です(すべてがとても良いからかもしれません)ので、私は最も多くの賛成票で答えを受け入れます、それは十分に公平だと思います。
linq - 範囲を設定するLINQ
LINQ式を使用してこの2番目の部分(for / foreach)を実行する方法がわかりません。また、LINQを使用した同様の例は見つかりませんでした。rangeDaysは約5から200の間であり、q1はRowIDがギャップなしで約10000から25000であるMyClassesのリストです。
前もって感謝します。
更新:以下に示すように、2つのlinqステートメントでこれを実行しました(今回はすべて実行可能であるといいのですが)。
これは許容できますが、次の単一のステートメントがNotSupportedExceptionをスローする理由を誰もが知っています。「ローカルシーケンスは、Contains演算子を除くクエリ演算子のLINQtoSQL実装では使用できません。」コンパイルして実行しようとすると:
lambda - スキームで let をラムダ関数として実装する方法
演習として、let を次のようなラムダ関数として定義しようとしています。
そして、私はそれを次のように呼ぶことを望んでいます:
ただし、バインドされていない変数 (この場合は "a") を引数として関数に渡す方法はありません。(少し奇妙に見えますが、関数を返すには let_as_lambda(var) が必要です。)
誰でもこれを行う方法を教えてもらえますか? アドバイスをいただければ幸いです。
実際、このラムダに相当する式を使用するだけです:
これを機能させることさえできません:
呼び出し元:(let_as_lambda a 3 (+ a 2))
同じ苦情を受けずに:
定義前の識別子への参照: a
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
テキストとして出力するだけでなく、 への呼び出しが実行されると便利です。