标签: free-variable

什么是自由变量?

Javascript闭包定义说:

"闭包"是一个表达式(通常是一个函数),它可以将自由变量与绑定这些变量的环境("关闭"表达式)结合在一起.

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

javascript closures free-variable

23
推荐指数
2
解决办法
1万
查看次数

什么是自由和绑定变量?

我已经编程了很长时间(实际上太长了),但我真的很难理解"自由变量"和"绑定变量"这两个术语.

我在网上找到的大多数"解释"都是从谈论Lambda演算和形式逻辑或Axiomatic Semantics等主题开始的.这让我想要伸手去拿左轮手枪.

有人可以解释这两个术语,理想情况是从实现的角度来解释.它们是否可以存在于编译语言中,以及它们转换为哪些低级代码?

free-variable bound-variable

20
推荐指数
2
解决办法
1万
查看次数

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

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

g op x y = x `op` y
Run Code Online (Sandbox Code Playgroud)

现在是一个带有自由(从观点来看f)变量的函数opx:

x = 1
op = (+)
f y = x `op` y
Run Code Online (Sandbox Code Playgroud)

f也是参考透明的.但它是纯粹的功能吗?

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


这个问题的动机:

维基百科的文章中我不清楚:

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

(强调我的)

也不是从谷歌搜索纯函数是否可以依赖于free(在一个封闭范围中绑定的意义上,而不是在函数范围内绑定)变量.

另外,这本书说:

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

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

现在我们知道函数中使用的变量是绑定的还是空闲的,我们可以将函数分为具有自由变量的函数和不具有以下函数的函数:

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

那么"纯函数"的定义是什么?

haskell functional-programming free-variable pure-function

15
推荐指数
1
解决办法
1300
查看次数

lambda表达式的自由变量列表

我刚刚为即将到来的OCaml测试做了一些功课,我遇到了一些麻烦.

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

t ::= x | t t | ?x. t  
Run Code Online (Sandbox Code Playgroud)

写一个类型术语来表示λ术语.假设变量表示为字符串.

好的,男孩.

# type t = Var of string | App of (t*t) | Abs of string*t;;
type t = Var of string | App of (t * t) | Abs of (string * t)
Run Code Online (Sandbox Code Playgroud)

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

fv(x) = {x}  
fv(t t') = fv(t) ? fv(t')  
fv(?x. t) = fv(t) \ {x}
Run Code Online (Sandbox Code Playgroud)

当然可以.

# let rec fv term = match term with
Var x -> [x]
  | App (t, t') …
Run Code Online (Sandbox Code Playgroud)

ocaml lambda-calculus free-variable

6
推荐指数
1
解决办法
2121
查看次数

如何在实际代码中出现"在封闭范围内赋值之前引用的NameError:自由变量'var'?

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

NameError: free variable 'var' referenced before assignment in enclosing scope
Run Code Online (Sandbox Code Playgroud)

我之前从未见过这个错误消息,并且用户只提供了一个不能自己引起错误的小代码片段,所以关闭我去google搜索信息,并且...似乎没有多少.在我搜索时,用户报告他们的问题已解决为"空白问题",然后离开了房间.

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

def multiplier(n):
    def multiply(x):
        return x * n
    del n
    return multiply
Run Code Online (Sandbox Code Playgroud)

这给了我:

>>> triple = multiplier(3)
>>> triple(5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in multiply
NameError: free variable 'n' referenced before assignment in enclosing scope
Run Code Online (Sandbox Code Playgroud)

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

  1. 很傻
  2. 不太可能偶然发生

......但鉴于我在本问题开头提到的报告,显然确实如此.

所以-怎么可以这个特定的例外发生在实际的代码?

python closures scope exception free-variable

6
推荐指数
2
解决办法
3440
查看次数

Prolog中的自由变量

谁能解释一下 Prolog 中自由变量的概念。它类似于匿名变量吗?或者有什么不同。如果给出一个例子来解释也可能很棒。

prolog free-variable

5
推荐指数
1
解决办法
343
查看次数

哪些Vars影响Clojure功能?

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

考虑一下Clojure函数的这个定义:

(def ^:dynamic *increment* 3)
(defn f [x]
  (+ x *increment*))
Run Code Online (Sandbox Code Playgroud)

这是(也是(1)的一个功能x,但也是(1) ;但我不太关心它.在为此函数编写测试时,我想确保控制所有相关输入,因此我执行以下操作:*increment*clojure.core/+

(assert (= (binding [*increment* 3] (f 1)) 4))
(assert (= (binding [*increment* -1] (f 1)) 0))
Run Code Online (Sandbox Code Playgroud)

(想象一下,这*increment*是某人可能合理改变的配置值;我不希望此功能的测试需要在发生这种情况时进行更改.)

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

(defn f [x]
  (+ x *increment* *additional-increment*))
Run Code Online (Sandbox Code Playgroud)

并忽略更新测试,我想测试失败,即使*additional-increment*是零.

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

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

  1. 从编译器获取信息

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

    user=> (defn g [x] …
    Run Code Online (Sandbox Code Playgroud)

static-analysis dynamic-analysis clojure free-variable

3
推荐指数
1
解决办法
264
查看次数

Julia 中的销毁类型

我必须销毁 Julia 中的某种类型,如下所示:

struct City
    x::Int
    y::Int
    index::Int
end
Run Code Online (Sandbox Code Playgroud)

我想要一个像

  destroy(City)
Run Code Online (Sandbox Code Playgroud)

这将删除它。是否可以?

感谢您的回答。

free-variable julia

3
推荐指数
1
解决办法
235
查看次数

宽松的后期绑定与严格的后期绑定

在阅读 Python\xe2\x80\x99s执行模型文档时,我意识到 Python\xe2\x80\x99s 自由变量似乎没有严格的后期绑定属性,其中任何代码块中发生的名称绑定都可以用于名称解析。事实上,执行:

\n
def f():\n    return x\n\ndef g():\n    x = 0\n    return f()\n\nprint(g())\n
Run Code Online (Sandbox Code Playgroud)\n

提高:

\n
NameError: name \'x\' is not defined\n
Run Code Online (Sandbox Code Playgroud)\n

它们具有相当松散的后期绑定属性,其中只有在引入自由变量的代码块的外部代码块中发生的名称绑定才能用于名称解析。确实执行

\n
NameError: name \'x\' is not defined\n
Run Code Online (Sandbox Code Playgroud)\n

印刷:

\n
0\n
Run Code Online (Sandbox Code Playgroud)\n

与严格的后期绑定属性相比,松散的后期绑定属性有哪些优点和缺点?

\n

python language-design late-binding free-variable

0
推荐指数
1
解决办法
577
查看次数