问题标签 [free-variable]

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 投票
2 回答
282 浏览

clojure - 哪些变量会影响 Clojure 函数?

如何以编程方式确定哪些 Var 可能会影响 Clojure 中定义的函数的结果?

考虑一下 Clojure 函数的定义:

这是 的函数x,也是*increment*(以及clojure.core/+(1)的函数;但我不太关心)。在为这个函数编写测试时,我想确保我控制所有相关的输入,所以我做了这样的事情:

(想象一下,这*increment*是一个配置值,有人可能会合理地更改;我不希望这个函数的测试在发生这种情况时需要更改。)

我的问题是:我如何编写一个断言,它的值(f 1)可以依赖于*increment*但不依赖于任何其他 Var?因为我希望有一天有人会重构一些代码并导致函数

并忽略更新测试,即使*additional-increment*为零,我也希望测试失败。

这当然是一个简化的例子——在一个大型系统中,可以有很多动态变量,并且可以通过一长串函数调用来引用它们。即使f调用引用 Var 的g调用,该解决方案也需要工作。h如果它不声称(with-out-str (prn "foo"))依赖于,那就太好了*out*,但这并不重要。如果被分析的代码调用eval或使用 Java 互操作,当然所有的赌注都没有了。

我可以想到三类解决方案:

  1. 从编译器获取信息

    我想编译器会扫描函数定义以获取必要的信息,因为如果我尝试引用一个不存在的 Var,它会抛出:

    请注意,这发生在编译时,无论有问题的代码是否会被执行。因此,编译器应该知道函数可能引用了哪些 Var,并且我希望能够访问该信息。

  2. 解析源代码并遍历语法树,并记录引用 Var 的时间

    因为代码就是数据等等。我想这意味着调用macroexpand和处理每个 Clojure 原语以及它们采用的每种语法。这看起来很像一个编译阶段,如果能够调用编译器的某些部分,或者以某种方式将我自己的钩子添加到编译器中,那就太好了。

  3. 检测 Var 机制,执行测试并查看哪些 Var 被访问

    不像其他方法那样完整(如果在我的测试未能执行的代码分支中使用 Var 怎么办?)但这就足够了。我想我需要重新定义def以产生类似于 Var 但以某种方式记录其访问的东西。


(1) 实际上,如果您重新绑定,该特定功能不会改变+;但是在 Clojure 1.2 中,您可以绕过该优化,(defn f [x] (+ x 0 *increment*))然后您就可以使用(binding [+ -] (f 3)). 在 Clojure 1.3 中,尝试重新绑定+会引发错误。

0 投票
1 回答
1000 浏览

coq - Coq 中的自由变量

是否有任何函数/命令可以使用 Coq 获取/检查一个自由变量,比如 n:U,是否存在于术语/表达式 e 中?请分享。

例如,我想在 Coq 中声明这个“n 不会出现在 e 的自由名称中”。

谢谢,

维拉亚特

0 投票
3 回答
1162 浏览

el - 列出 EL 表达式中的自由变量

我有一个应用程序,其中包含一些用于编程配置的 EL 评估。给定一个 EL 表达式,我想在不实际评估它的情况下获得它包含的自由变量。目的是提供一个 UI,最终用户可以在按下“评估”按钮之前将值绑定到自由变量。

不幸javax.el.ValueExpression的是不提供这个功能,所以我可能需要使用特定于供应商的 API。它还处于开发的早期阶段,所以我还没有确定我的实现选择。我想到了 MVEL、JUEL 和 SpEL,但当然我选择的任何东西都应该具有我上面描述的功能。

0 投票
4 回答
15989 浏览

javascript - 什么是自由变量?

Javascript闭包定义说:

“闭包”是一个表达式(通常是一个函数),它可以具有自由变量以及绑定这些变量的环境(即“关闭”表达式)。

有人可以向我解释自由变量的概念吗?这个概念是 Javascript 特有的还是也适用于其他语言?

0 投票
1 回答
2791 浏览

ocaml - lambda 表达式的自由变量列表

我只是在为即将到来的 OCaml 测试做一些功课,但遇到了一些麻烦。

考虑由以下抽象语法定义的 λ 项语言(其中 x 是一个变量):

写一个类型项来表示 λ 项。假设变量表示为字符串。

好的,男孩。

项 t 的自由变量 fv(t) 归纳定义如下:

肯定的事。

例如,

让我们检查一下。

我检查了一百万次,我确信结果应该包括“z”变量。你能就此向我保证吗?

0 投票
1 回答
1893 浏览

variables - Haskell - 确定函数的一组自由和有界变量

我必须确定函数 s1 和 s2 的自由和有界变量集:

所以,对于 s1 我会写:

我对么?或者应该是:

因为 y 和 x 是两次免费的。一旦 y 在 If 然后 -> y 的结果和 x: x 在 \z 的结果中是自由的一次,在最后是第二次。

有界变量将是:

因为 z 是有界 var 的两倍。

以同样的方式,我会确定 s2 的 FV 和 BV:

你能告诉我我是对还是错?

提前致谢

0 投票
2 回答
19892 浏览

free-variable - 什么是自由和绑定变量?

我已经编程了很长时间(实际上太长了),但我真的很难掌握“自由变量”和“绑定变量”这两个术语。

我在网上找到的大多数“解释”都是从谈论诸如 Lambda 演算和形式逻辑或公理语义之类的话题开始的。这让我想去拿我的左轮手枪

有人可以从实现的角度解释这两个术语吗?它们可以存在于编译语言中,它们翻译成什么低级代码?

0 投票
3 回答
1650 浏览

haskell - 纯函数可以有自由变量吗?

例如,一个没有自由变量的引用透明函数:

A 现在是一个具有自由(从 的角度f)变量op和的函数x

f也是参照透明的。但它是纯函数吗?

如果它不是纯函数,那么引用透明但使用绑定在封闭范围内的 1 个或多个变量的函数的名称是什么?


这个问题的动机:

从Wikipedia的文章中我不清楚:

结果值不必依赖于所有(或任何)参数值。但是,它必须依赖于参数值。

(强调我的)

谷歌也没有搜索纯函数是否可以依赖自由(在被绑定在封闭范围内,而不是在函数范围内绑定的意义上)变量。

另外,这本书说:

如果没有自由变量的函数是纯函数,那么闭包是不纯的吗?

该功能function (y) { return x }很有趣。它包含一个自由变量 x。自由变量是未绑定在函数内的变量。到目前为止,我们只看到了一种“绑定”变量的方法,即传入一个同名的参数。由于该函数function (y) { return x }没有名为 x 的参数,因此变量 x 未绑定在此函数中,这使其“自由”。</p>

现在我们知道函数中使用的变量要么是绑定的,要么是自由的,我们可以将函数分为具有自由变量和没有自由变量的函数:

  • 不包含自由变量的函数称为纯函数。
  • 包含一个或多个自由变量的函数称为闭包。

那么“纯函数”的定义是什么?

0 投票
1 回答
3897 浏览

python - “NameError:在封闭范围内赋值之前引用的自由变量'var'”如何在实际代码中发生?

当我在Python 聊天室闲逛时,有人进来并报告了以下异常:

我以前从未见过该错误消息,并且用户只提供了一个小代码片段,它本身不会导致错误,所以我去谷歌搜索信息,并且......似乎没有太多. 在我搜索时,用户报告他们的问题已解决为“空白问题”,然后离开了房间。

在玩了一会儿之后,我只能用这样的玩具代码重现异常:

这给了我:

一切都很好,但我很难弄清楚这个异常是如何在野外发生的,因为我上面的例子是

  1. 相当愚蠢
  2. 不可能偶然发生

...但显然它确实如此,鉴于我在这个问题开始时提到的报告。

那么 -这个特定的异常如何在实际代码中发生

0 投票
1 回答
460 浏览

python - `del` 语句和自由变量

今天测试一些Python代码我尝试了以下代码:

(以下在 Python 3.2+ 上运行,尽管以前的版本会引发一个SyntaxErrorwhendel被使用并且一个变量在封闭范围内被引用)

如您所见,Python 不会 raises NameError: global name 'N' is not defined,这让我想知道一件事:

del语句与函数的封闭范围一起使用来删除在嵌套函数中使用的自由变量y时,如果我们的例子中的自由变量N是通过del封闭范围中的语句删除的,那么del实际上是删除名称的( N) 值并将其绑定到封闭范围?

A)这就是它提出的原因:NameError: free variable 'N' referenced before assignment...而不是NameError: global name 'N' is not defined

B)如何del实际删除一个名字?它是否解除了它的价值并将其保持在一个范围内?

我在这里发现了一个类似的案例