问题标签 [lexical-scope]

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 投票
1 回答
56 浏览

r - 词法范围/调用堆栈问题:R 无法识别参数的默认值

这是我在 R 中遇到过的最奇怪的事情。

是否有可能,某些参数名称(lazy在我的情况下)是特殊的/保留的,因此当涉及跨三个不同包的函数的调用堆栈时会导致意外行为:optionr::setAnywhereOptions()调用nestr::setNested()调用reactr::setShinyReactive()

考虑以下示例/情况(也在此GitHub 问题中描述)

改编自包中的这个单元测试optionr

请注意我为调试包含的状态消息:

出于某种原因,对于这个调用堆栈结构,函数reactr::setShinyReactive()似乎不再识别默认值,lazy而其他函数(例如 of push)似乎被识别得很好。

更准确地说,如果没有我的解决方法(见下文),R 在到达此代码部分时会抱怨。但是,如您所见,默认值定义,如果该函数被单独调用或从内部调用,它也可以正常工作nestr::setNested()

解决方法

当我将参数名称从更改lazyis_lazy(或仅包括is_lazy然后lazy <- is_lazy在正文中运行)时,一切正常(请参阅上面的调试输出)。

请参阅中的调试部分reactr::setShinyReactive()

疯狂猜测这里发生了什么

我首先想到的是,这一定词法作用域机制有关,因为“简单函数调用堆栈”不会出现这种行为。

第二个猜测是,也许S4机制在这里也造成了一些麻烦。也许也与这个问题有关?

0 投票
2 回答
553 浏览

lambda - 在 HHVM/Hack lambda 表达式中更改词法范围变量的值?

是否可以在 Hack lambda 表达式中更改词法范围变量的值?

我希望返回值是false

0 投票
1 回答
45 浏览

ruby - 默认参数值规范中未评估的代码

(至少某种)Ruby 代码在方法的默认值规范中被接受和评估。在下面,"foo" * 3评估:

但是,当我尝试在默认值描述中的某个范围内评估局部变量/方法时,如下所示,局部变量/方法是在词法范围下评估的:

  • 为什么foo上面没有在MAIN范围内评估而在词法范围内评估?
  • 这似乎对可以在默认值描述中评估的 Ruby 表达式有一些限制。究竟可以放什么?
0 投票
2 回答
3436 浏览

javascript - ES6 arrow function lexical this in V8

I have the following ES6 code using a fat arrow function:

#xA;

According to how arrow functions are supposed to work I'd expect this to be the test object. ES6Fiddle, Traceur and Firefox produce the expected output which is ["David", "David", "David"].

When enabling those features in Chrome using chrome://flags/#enable-javascript-harmony, however, I get [undefined, undefined, undefined]. If you console.log(this) it shows that it is the window object and you get an error in strict mode. Is the lexical this for ES6 arrow functions not implemented in V8 yet?

0 投票
1 回答
442 浏览

javascript - 冒泡范围 - 从嵌套函数更新 var

我正在从嵌套函数的外部范围更新变量,
因为这是在初始化函数期间发生的,外部范围不是最外部(窗口)范围;

为了将它保存在 init-function 范围内,我省略了var关键字,并且正如预期的那样,变量的新值会冒泡并更新;

但结果 console.log('x' in window ) 是假的,
不是冒泡应该到达窗口范围吗?

0 投票
1 回答
298 浏览

r - 嵌套 R 函数的范围

我有一个例子,我不确定我是否理解 R 中的作用域,也不认为它在做正确的事情。该示例由 J. Fox 修改自“An R and S-PLUS Companion to Applied Regression”

我在列表中所期望的三个函数分别计算恒等函数、平方函数和立方函数,但它们都将它们的参数立方化。如果我不使用 lapply,它会按预期工作。

我是唯一一个觉得这令人惊讶或不安的人吗?是否有一个深刻的令人满意的理由?谢谢

PS:我在 Google 和 SO 上进行了搜索,但是,可能由于与此问题相关的关键字的普遍性,我空手而归。

PPS:这个例子的动机是包 quickcheck 中的一个真正的错误,而不是纯粹的好奇。我有一个解决该错误的方法,感谢您的关注。这是关于学习的东西。

当然,在发布问题后,我想到了一个可以澄清问题的不同示例。

p 与隐藏在 lapply 中的循环变量具有相同的作用。p 由一个方法传递,在这种情况下,该方法看起来像对 make.power 的引用。Make.power 不评估它,只是保留一个指向它的指针。我在正确的轨道上吗?

0 投票
2 回答
184 浏览

lisp - 符号和名称是否不同?

符号和名称是否不同?关于 Lisp的 Paul Graham 专注于常见的 lisp,有一些讨论似乎暗示了这一点,例如

由于 lambda 表达式也是函数的名称,它们也可以首先出现在函数调用中:
((lambda (x) (* x 2) 3)
6

这听起来像是符号是名称,但名称不是符号。但我不明白什么样的 Lisp“对象”符号是/可能是。

这也源于我在此处对尖引号 ( #') 运算符 v.提出的问题symbol-function。我怀疑这些不同的唯一原因是因为并非所有名称都是符号,但我还没有足够的背景来理解这些答案(因此这个问题)。

我还要求在 elisp v. common lisp 中进行澄清。我假设这与词汇形式有关,直到版本 24(我认为是 24.1)才在 elisp 中引入。

0 投票
2 回答
512 浏览

lisp - 动态作用域可以实现词法作用域吗?

旧 Lisp,包括某个时候的 Common Lisp 和 emacs 24.1 之前的 elisp,是动态范围的,在我读过的资源中,共识似乎是词法范围更好地编程。

我感觉动态范围更容易理解。动态范围可以完全根据符号及其值来考虑。词法作用域需要一个新的“绑定”概念,据我目前所知,它破坏了 Lisp 语言的一些简单/优雅。

我一直在思考如何问这个问题,“词法作用域会破坏一些优雅吗?” 更严格地说,我最好的想法是看看它们是否等效,即是否可以实现另一个。

是否可以将词法范围的 lisp 实现为动态范围列表中的简单扩展?如果解释器不引入新的临时符号,是否可以这样做?

更具体地说let,创建词法范围的 可以在动态范围的 lisp 中实现吗?

0 投票
2 回答
151 浏览

scope - 为什么 Common Lisp 中的闭包没有捕获封闭函数的参数?

test.lisp

在 REPL 中:

我认为现在 common lisp 应该是词法范围的,那么为什么var1内部 lambda 没有捕获的值test呢?我怎样才能确保它被捕获?

0 投票
1 回答
51 浏览

r - 函数内函数的词法作用域何时确定?

我查看了 R 中的其他词汇范围问题,但找不到答案。考虑这段代码:

f(3)将返回 10 的答案。我的问题是为什么?该点g()是在代码中定义的,z尚未分配任何值。在什么时候g()创建闭包?它是否“向前看”到函数体的其余部分?g(x)它是在评估时创建的吗?如果是这样,为什么?