问题标签 [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来消除重复,如下所示:

但这适用于 中的第一项*exprs-to-test*,然后与NullPointerException. 为什么添加会let导致崩溃?

0 投票
6 回答
31095 浏览

lambda - 计划中的 lambda 有什么意义?

我正在学习计划。我知道如何同时使用 lambda 和 let 表达式。

但是,我正在努力弄清楚使用 lambda 的意义何在。你不能用 let 做所有你可以用 lambda 做的事情吗?

看一个 lambda 表达式比 let 更好的选择的例子会特别有帮助。

另一件事 - 是否也存在 let 比 lambda 更有用的情况?如果是这样,这样的例子也很好。

编辑:我也对对比定义和 lambda 感兴趣,因为它们似乎执行类似的任务。


更新:

感谢大家的帮助。阅读您的答案后,我对 lambda/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 的次数(我只考虑第二个列表)。现在的问题....运行两次然后...

我之前使用的是关联列表,但为了解决这个问题并保持简单,我现在使用的是列表。我想我的另一个问题是,如何动态创建关联列表元素?我不喜欢这样声明 'var',但我只是想暂时避开 'let'。我对'setq'或'setf'也没有太多运气......

在此先感谢您的帮助!

0 投票
5 回答
61428 浏览

haskell - Haskell:在哪里与让

我是 Haskell 的新手,我对Where vs. Let感到非常困惑。它们似乎都提供了相似的目的。我已经阅读了WhereLet之间的一些比较,但我无法辨别何时使用它们。有人可以提供一些上下文或一些示例来演示何时使用一个而不是另一个?

在哪里与让

where子句只能在函数定义级别定义。通常,这与定义的范围相同let唯一的区别是何时使用警卫。该where条款的范围涵盖所有警卫。相反,let表达式的范围只是当前函数子句和保护,如果有的话。

Haskell 备忘单

Haskell Wiki非常详细,提供了各种案例,但它使用了假设的示例。我发现它的解释对于初学者来说太简短了。

Let的优点

控制单子状态

将不起作用,因为 where 指的是匹配 f = 的模式,其中没有 x 在范围内。相反,如果您从 let 开始,那么您将不会遇到麻烦。

Haskell Wiki 关于 Let 的优点

哪里的优点

声明与表达

Haskell wiki 提到Where子句是声明性的,而Let表达式是表达性的。除了风格之外,它们的表现有何不同?

  1. 在第一个示例中,为什么Let在范围内但Where不在?
  2. 是否可以将Where应用于第一个示例?
  3. 有些人可以将此应用于变量代表实际表达式的真实示例吗?
  4. 是否有一个一般的经验法则可以遵循何时使用它们?

更新

对于那些后来通过这个线程来的人,我在这里找到了最好的解释:“ Haskell 的简单介绍”。

让表达式。

当需要一组嵌套的绑定时,Haskell 的 let 表达式很有用。作为一个简单的例子,考虑:

由 let 表达式创建的绑定集是相互递归的,并且模式绑定被视为惰性模式(即它们带有隐含的 ~)。唯一允许的声明是类型签名、函数绑定和模式绑定。

Where 子句。

有时在几个受保护的方程上进行范围绑定很方便,这需要一个 where 子句:

请注意,这不能用 let 表达式来完成,它只作用于它所包含的表达式。where 子句只允许在一组方程式或案例表达式的顶层使用。let 表达式中绑定的相同属性和约束适用于 where 子句中的那些。这两种形式的嵌套范围看起来非常相似,但请记住,let 表达式是表达式,而 where 子句不是——它是函数声明和 case 表达式语法的一部分。

0 投票
6 回答
4247 浏览

scala - Clojure 在 Scala 中的“让”等价物

我经常遇到以下情况:假设我有这三个功能

我也有calculate功能。我的第一种方法可能如下所示:

它看起来很漂亮,没有任何花括号——只有一种表达方式。但这不是最优的,所以我最终得到了这段代码:

现在是用大括号括起来的几个表达式。在这样的时刻,我有点羡慕 Clojure。使用let 函数,我可以在一个表达式中定义此函数。

所以我的目标是calculate用一个表达式定义函数。我想出了2个解决方案。

1 - 使用scalaz我可以这样定义它(有没有更好的方法来使用 scalaz?):

我不喜欢这个解决方案的是它是嵌套的。我拥有的 s越多val,这个嵌套就越深。

2 - 通过for理解,我可以实现类似的目标:

一方面,这个解决方案具有扁平结构,就像let在 Clojure 中一样,但另一方面我需要将函数的结果包装起来并作为结果Option接收(这很好,我正在处理空值,但我不...... .并且不想)。Optioncalculate

有没有更好的方法来实现我的目标?处理这种情况的惯用方式是什么(也许我应该和vals 呆在一起......但是let这样做的方式看起来很优雅)?

另一方面,它与参照透明度有关。所有三个函数都是引用透明的(在我的示例中firstFn计算一些常数,如 Pi),因此理论上它们可以用计算结果替换。我知道这一点,但编译器不知道,所以它无法优化我的第一次尝试。这是我的第二个问题:

我能否以某种方式(可能带有注释)向编译器提示我的函数是引用透明的,以便它可以为我优化这个函数(例如,在那里放置某种缓存)?

编辑

感谢大家的精彩回答!选择一个最佳答案是不可能的(可能是因为它们都很好)所以我会接受投票最多的答案,我认为这很公平。

0 投票
2 回答
971 浏览

linq - LINQ 填充范围

我不知道如何使用 LINQ 表达式来完成第二部分(for/foreach),也没有找到任何与 LINQ 类似的示例。rangeDays 将在大约 5 到 200 之间,并且 q1 是 MyClasses 的列表,其中 RowID 大约从 10000 到 25000,没有间隙。

提前致谢。


更新:我用 2 个 linq 语句运行了它,如下所示(希望这一次都可以运行)。

这是可以接受的,但有谁知道为什么下面的单个语句会引发 NotSupportedException “本地序列不能用于查询运算符的 LINQ to SQL 实现中,但包含运算符除外。” 当我尝试编译和运行时:

0 投票
1 回答
2913 浏览

lambda - 如何在 Scheme 中实现 let 作为 lambda 函数

作为练习,我试图将 let 定义为 lambda 函数,如下所示:

我希望这样称呼它:

但是,没有办法将未绑定的变量(在本例中为“a”)作为参数传递给函数。(我知道它看起来有点奇怪,但我需要 let_as_lambda(var) 来返回一个函数。)

谁能告诉我如何做到这一点?任何建议表示赞赏。

事实上,只需使用这个 lambda 等效表达式:

我什至不能让它工作:

调用者:(let_as_lambda a 3 (+ a 2))

没有得到同样的抱怨:

在定义之前引用标识符:a

0 投票
2 回答
267 浏览

scheme - 计划将 let* 重写为嵌套的一元让

我编写了一个函数match-rewriter,它本质上是match-lambda如果找不到匹配项则返回其参数:

现在我想使用match-rewriter代表源代码的字符串let*并将其重写为嵌套的一元lets

我真的很困惑如何匹配这个。我需要返回:

但是嵌套让我很难过。任何建议表示赞赏。


好的,这是我最好的尝试:

但这就是它的行为方式:

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

我对以下参数的顺序感到困惑:

在我看来应该是:

let*→nested-unary-lets此外,如果执行调用而不是仅打印为文本,那就太好了。