问题标签 [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.
scope - 动态范围的优点是什么?
我了解到静态作用域是唯一明智的做事方式,而动态作用域是魔鬼的工具,仅由解释器/编译器的不良实现造成。
然后我从Common Lisp vs. Scheme文章中看到了这个片段:
为什么 Common Lisp “在这一点上获胜”?使用动态作用域更容易做哪些事情?我真的无法证明需要它/将其视为一件好事。
language-agnostic - 动态范围 - 深层绑定与浅层绑定
我一直试图了解浅绑定和深绑定,维基百科没有很好地解释它。假设我有以下代码,如果语言使用动态范围,输出会是什么
a) 深度绑定
b) 浅绑定?
python - 如何在 Python 中创建动态范围变量?
我正在将一些代码从 lisp 翻译成 Python。
在 lisp 中,您可以有一个 let 构造,其中引入的变量声明为特殊,因此具有动态范围。(参见http://en.wikipedia.org/wiki/Dynamic_scope#Dynamic_scoping)
我怎样才能在 Python 中做同样的事情?似乎该语言不直接支持这一点,如果为真,那么模拟它的好方法是什么?
lisp - 在 Tcl 中模拟 lisp cons 单元格
lisp 中的列表是一系列 cons 单元格,但在 Tcl 中,列表是用空格分隔元素的字符串。要将代码从 lisp 转换为 tcl,可以简单地将 lisp 列表转换为 Tcl 列表。但是,这会遇到副作用,因为 cons 单元不会出现在 Tcl 代码中。例如,考虑 lisp 中的这段代码:
是否有一个 Tcl 包可以更好地模拟 Tcl 中的 lisp 列表?这样的包是否可以轻松转换为常规 Tcl 列表?
上面的代码在 Tcl 中使用这样的包会是什么样子?
lisp - 闭包和动态范围?
我想我理解为什么在使用动态范围的语言中允许闭包存在危险。也就是说,您似乎可以关闭变量 OK,但是在尝试读取它时,您只会获得全局堆栈顶部的值。如果其他函数在此期间使用相同的名称,这可能会很危险。
我错过了其他一些微妙之处吗?
dynamic-scope - 采用变量的动态范围
想象一下,您正在设计自己的编程语言。非常简单的语言,用于非常特定的目的。它有函数、循环和变量。并且您想对变量使用动态范围。
考虑这个假想的例子:
我的问题是 - 如何使循环内设置的“计数”变量值在外部可见?你会怎么做才能让用户看起来更自然(或不那么混乱)?
- 除了在当前范围内定义新变量的关键字之外,您是否会引入一个特殊关键字来为外部范围内的现有变量赋值?让我们说set和var,或者assing和def等。但是“外部范围”是什么意思呢?如果 'count' 没有在循环之前定义,而是在调用堆栈的某个位置更早地定义了怎么办?“set count = ...”是否会从父框架的父级的父级为变量分配一个值?
您是否会在循环语句中引入一个返回值(或元组),以便可以编写如下内容:
var count = 0 var count = 循环(条件 == true)返回 [i] { var i = i + 1 }
会不会显得很尴尬?
- 你的解决方案?
据了解 Perl 支持使用local关键字的动态范围。您将如何仅使用动态范围变量在 Perl 中实现这样的示例?
谢谢!
ruby-on-rails - 在 Rails 中制作动态作用域助手
我的几个部分可以以两种“模式”呈现。如果full_display
是false
,我不会渲染多个字段。为了方便起见,我想将“模式”之一设为默认值 - 如果full_display
未定义,则将其视为false
. 我想出了这段代码:
有很多东西可以四处走动。将它放在帮助程序或其他东西中会很好,但由于 Ruby 只有词法范围,我想不出任何好的方法来做到这一点。
我已经尝试过的坏主意:
- 在部分的顶部 do
<% display = long code that is above %>
和 use 通过代码显示,但是在视图中创建局部变量看起来很糟糕,并且必须将 using 复制到每个部分中full_display
。 - 将它包装在一个字符串中,将其放入一个助手中并在视图中使用 eval(display_helper) ,但显然这会产生安全问题。
scala - scala:动态作用域的内部类方法是什么?
我正在尝试评估此处描述的所有 3 种动态作用域方法(https://wiki.scala-lang.org/display/SYGN/Dynamic-scope),除了“内部类方法”之外,我都理解。描述如下:
使用嵌套类定义可以实现与动态范围类似的效果。通过将整个状态消耗代码定义为状态对象的内部类,并在每次需要新的全局状态时实例化该对象,所有包含的代码都可以通过父引用直接访问状态变量。
为了避免在单个文件中定义整个程序,这种方法在大多数情况下都要求使用组件混合,以便将程序组合成单个类。
我不太明白这一点 - 有人可以给出一些示例代码来展示这一点吗?隐式参数的第二种方法对我来说很有意义,但文章还建议它可以与内部类方法结合使用,我也不太明白。谢谢!
emacs - 如何克服emacs lisp闭包缺少局部变量的问题
我现在正在学习参考手册中的 Emacs Lisp 和LISP Book 中的 Common Lisp 。
来自 Common Lisp 书
由于它的动态绑定行为,该函数在 Emacs Lisp 中不起作用。
我想知道是否可以在不引入全局变量的情况下在 Emacs Lisp 中实现相同的功能?
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)都不需要使用请求范围变量的情况。使用我错过的请求范围有什么原因吗?