问题标签 [dynamic-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 投票
10 回答
14758 浏览

scope - 动态范围的优点是什么?

我了解到静态作用域是唯一明智的做事方式,而动态作用域是魔鬼的工具,仅由解释器/编译器的不良实现造成。

然后我从Common Lisp vs. Scheme文章中看到了这个片段:

为什么 Common Lisp “在这一点上获胜”?使用动态作用域更容易做哪些事情?我真的无法证明需要它/将其视为一件好事。

0 投票
3 回答
33774 浏览

language-agnostic - 动态范围 - 深层绑定与浅层绑定

我一直试图了解浅绑定和深绑定,维基百科没有很好地解释它。假设我有以下代码,如果语言使用动态范围,输出会是什么

a) 深度绑定

b) 浅绑定?

0 投票
4 回答
5282 浏览

python - 如何在 Python 中创建动态范围变量?

我正在将一些代码从 lisp 翻译成 Python。

在 lisp 中,您可以有一个 let 构造,其中引入的变量声明为特殊,因此具有动态范围。(参见http://en.wikipedia.org/wiki/Dynamic_scope#Dynamic_scoping

我怎样才能在 Python 中做同样的事情?似乎该语言不直接支持这一点,如果为真,那么模拟它的好方法是什么?

0 投票
1 回答
745 浏览

lisp - 在 Tcl 中模拟 lisp cons 单元格

lisp 中的列表是一系列 cons 单元格,但在 Tcl 中,列表是用空格分隔元素的字符串。要将代码从 lisp 转换为 tcl,可以简单地将 lisp 列表转换为 Tcl 列表。但是,这会遇到副作用,因为 cons 单元不会出现在 Tcl 代码中。例如,考虑 lisp 中的这段代码:

是否有一个 Tcl 包可以更好地模拟 Tcl 中的 lisp 列表?这样的包是否可以轻松转换为常规 Tcl 列表?

上面的代码在 Tcl 中使用这样的包会是什么样子?

0 投票
2 回答
2228 浏览

lisp - 闭包和动态范围?

我想我理解为什么在使用动态范围的语言中允许闭包存在危险。也就是说,您似乎可以关闭变量 OK,但是在尝试读取它时,您只会获得全局堆栈顶部的值。如果其他函数在此期间使用相同的名称,这可能会很危险。

我错过了其他一些微妙之处吗?

0 投票
1 回答
268 浏览

dynamic-scope - 采用变量的动态范围

想象一下,您正在设计自己的编程语言。非常简单的语言,用于非常特定的目的。它有函数、循环和变量。并且您想对变量使用动态范围

考虑这个假想的例子:

我的问题是 - 如何使循环内设置的“计数”变量值在外部可见?你会怎么做才能让用户看起来更自然(或不那么混乱)?

  • 除了在当前范围内定义新变量的关键字之外,您是否会引入一个特殊关键字来为外部范围内的现有变量赋值?让我们说setvar,或者assingdef等。但是“外部范围”是什么意思呢?如果 'count' 没有在循环之前定义,而是在调用堆栈的某个位置更早地定义了怎么办?“set count = ...”是否会从父框架的父级的父级为变量分配一个值?
  • 您是否会在循环语句中引入一个返回值(或元组),以便可以编写如下内容:

    var count = 0 var count = 循环(条件 == true)返回 [i] { var i = i + 1 }

会不会显得很尴尬?

  • 你的解决方案?

据了解 Perl 支持使用local关键字的动态范围。您将如何使用动态范围变量在 Perl 中实现这样的示例?

谢谢!

0 投票
1 回答
635 浏览

ruby-on-rails - 在 Rails 中制作动态作用域助手

我的几个部分可以以两种“模式”呈现。如果full_displayfalse,我不会渲染多个字段。为了方便起见,我想将“模式”之一设为默认值 - 如果full_display未定义,则将其视为false. 我想出了这段代码:

有很多东西可以四处走动。将它放在帮助程序或其他东西中会很好,但由于 Ruby 只有词法范围,我想不出任何好的方法来做到这一点。

我已经尝试过的坏主意:

  • 在部分的顶部 do<% display = long code that is above %>和 use 通过代码显示,但是在视图中创建局部变量看起来很糟糕,并且必须将 using 复制到每个部分中full_display
  • 将它包装在一个字符串中,将其放入一个助手中并在视图中使用 eval(display_helper) ,但显然这会产生安全问题。
0 投票
1 回答
719 浏览

scala - scala:动态作用域的内部类方法是什么?

我正在尝试评估此处描述的所有 3 种动态作用域方法(https://wiki.scala-lang.org/display/SYGN/Dynamic-scope),除了“内部类方法”之外,我都理解。描述如下:

使用嵌套类定义可以实现与动态范围类似的效果。通过将整个状态消耗代码定义为状态对象的内部类,并在每次需要新的全局状态时实例化该对象,所有包含的代码都可以通过父引用直接访问状态变量。

为了避免在单个文件中定义整个程序,这种方法在大多数情况下都要求使用组件混合,以便将程序组合成单个类。

我不太明白这一点 - 有人可以给出一些示例代码来展示这一点吗?隐式参数的第二种方法对我来说很有意义,但文章还建议它可以与内部类方法结合使用,我也不太明白。谢谢!

0 投票
4 回答
812 浏览

emacs - 如何克服emacs lisp闭包缺少局部变量的问题

我现在正在学习参考手册中的 Emacs Lisp 和LISP Book 中的 Common Lisp 。

来自 Common Lisp 书

由于它的动态绑定行为,该函数在 Emacs Lisp 中不起作用。

我想知道是否可以在不引入全局变量的情况下在 Emacs Lisp 中实现相同的功能?

0 投票
1 回答
26988 浏览

jsp - 什么时候适合在 JSP 中设置请求范围的变量?

根据我的经验,很少/从不需要设置scope="request"EL 变量。

例如,我有一个页面,给定一个item参数,根据其属性构造一个特定于该项目的 URL。此页面包含在需要呈现项目链接的任何页面中。

(A) 使用请求范围的变量

itemLink.jsp

其他页面.jsp

(B) 没有请求范围的变量

itemLink.jsp

其他页面.jsp

有什么理由使用(A)而不是(B)吗?我的回答是否定的,理由如下:

  • 使用(A),您需要记住在同一请求期间处理的任何其他页面都会看到itemUrl,因此您应该避免名称冲突。它还使得跟踪 EL 变量的来源变得更加困难,因为除了搜索在同一请求期间处理的所有页面之外,无法找到请求范围变量的设置位置。

  • 使用(B),这些都不是问题,因为变量只有页面范围。

编辑:

也许有比(B)更好的解决方案:

(C) 使用静态包含

itemLink.jspf

其他页面.jsp

仍然存在替代方案(B)(C)都不需要使用请求范围变量的情况。使用我错过的请求范围有什么原因吗?