我需要在Javascript中获得有关范围问题的一些信息.我知道它支持词法(静态)范围,但是,它是否也支持动态范围?如果您对Javascript中的范围有任何了解,请与我分享?
谢谢
我有一个像这样的默认范围是动态的:
default_scope :conditions => ["departure_date >= ?", DateTime.current.beginning_of_day]
Run Code Online (Sandbox Code Playgroud)
当我使用这段代码时,第一天就可以了.让我们说第一天是28-03-2011
但第二天似乎还在使用 "departure_date >= 28-03-2011"
我的默认范围是否被缓存?
我在我的一个项目中玩setTimeout以限制向DOM添加元素(因此UI在页面加载期间不会冻结).但是,我遇到了一些让我感到困惑的事情.鉴于此代码:
for(var i = 0; i < 5; i++) {
var j = i + 10;
console.log("i is: " + i + " j is: " + j);
setTimeout(function() {
console.log("in timeout i is: " + i + " j is: " + j);
}, i * 1000);
}
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
i is: 0 j is: 10
i is: 1 j is: 11
i is: 2 j is: 12
i is: 3 j is: 13
i is: …Run Code Online (Sandbox Code Playgroud) 在阅读了有关声明SPECIAL 的文档、特殊运算符LET、宏DEFVAR以及 StackOverflow 上关于 Common Lisp 中动态与词法范围的几个问题之后,例如,this 之后,我仍然无法理解以下行为在 SBCL 中评估这些形式。
;; x is a free variable
CL-USER> (defun fn ()
(print x))
; in: DEFUN FN
; (PRINT X)
;
; caught WARNING:
; undefined variable: X
;
; compilation unit finished
; Undefined variable:
; X
; caught 1 WARNING condition
FN
CL-USER> (describe 'x)
COMMON-LISP-USER::X
[symbol]
; No value
CL-USER> (let ((x 'dinamic_1st_binding))
(declare (special x))
(print x)
(fn)
(let …Run Code Online (Sandbox Code Playgroud) 考虑以下C程序
#include <stdio.h>
typedef struct s {
int x;
} s_t;
int main() {
int x;
s_t a;
scanf("%d", &x);
if (x > 0) {
s_t a;
a.x = x;
}
printf("%d\n", a.x);
}
Run Code Online (Sandbox Code Playgroud)
将a在If分支结构变量明确阴影的a主结构体变量.可以预期printf中的输出将是未定义的,但是对于GCC,范围变量似乎等于主变量.
例如
gcc test.c -o test
echo 10 | ./test
Run Code Online (Sandbox Code Playgroud)
将输出10.
另一方面,通过clang执行此操作,正如预期的那样
clang test.c -o test
echo 10 | ./test
Run Code Online (Sandbox Code Playgroud)
输出-2145248048.
这是一个GCC错误还是存在某种未触发的行为?
gcc 4.8.2 clang 3.4
我有一个在全局范围内声明的类,另一个具有相同名称的类嵌套在某个类中.
class Address {
var someProperty: String?
}
class ThirdPartyAPI {
class Address {
var someOtherProperty: String?
init(fromAddress address: Address) {
self.someOtherProperty = address.someProperty
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是:如何从初始化中引用全局类而不是内部类?在给出的示例中,我遇到了错误Value of type 'ThirdPartyAPI.Address' has no member 'someProperty',这意味着编译器引用内部Address而不是全局内部.
我正在学习 Python,更具体地说,我正在探索范围规则。
我尝试了以下“实验”:
def increment(n):
n += 1
print(n)
return n
n = 1
increment(n)
print(n)
Run Code Online (Sandbox Code Playgroud)
这段代码输出: 2 , 1 ,既然变量 n 返回到全局环境,难道不应该输出 2, 2 吗?
您的建议将不胜感激。
我是 Julia 的新手,到目前为止我是它的粉丝。但是从多年的 R 编程经验来看,一些范围规则让我感到困惑。
让我们来看看这个函数。这完全符合我的预期。
function foo1(x)
y = x
t = 1
while t < 1000
t += 1
y += 1
end
return 42
end
var = 0;
foo1(var)
# 42
var
# 0
Run Code Online (Sandbox Code Playgroud)
但是当对数组做类似的事情时,它充当一个变异函数(在全局范围内修改它的参数!)
function foo2(x)
y = x
t = 1
while t < 1000
t += 1
y[1] += 1
end
return 42
end
var = zeros(1);
foo2(var)
# 42
var
# 999.0
Run Code Online (Sandbox Code Playgroud)
我意识到我可以通过将第一行更改为 来解决这个问题y = copy(x),但是首先出现这种(危险的?)行为的原因是什么?
我想定义一个函数(而不是宏),它可以在其调用的范围内设置变量。
我努力了:
(defun var-set (var-str val)
(let ((var-interned
(intern (string-upcase var-str))))
(set var-interned val)
))
(let ((year "1400"))
(var-set "year" 1388)
(labeled identity year))
Run Code Online (Sandbox Code Playgroud)
由于范围规则,这不起作用。有什么“技巧”可以实现这一点吗?
在Python中,我可以使用
previous_frame = sys._getframe(1)
previous_frame_locals = previous_frame.f_locals
previous_frame_locals['my-var'] = some_value
Run Code Online (Sandbox Code Playgroud)
lisp 有等效的 API 吗?
在R语言中,假设我有一个函数ff(jj,kk,mm).我希望调用函数(或调用人在交互式会话中)能够在调用时使jj和kk以任意方式取决于mm.
具体而言,假设:
ff <- function(jj, kk, mm){
xx <- jj + kk
out<- xx/mm
out
}
Run Code Online (Sandbox Code Playgroud)
然后在运行时,我想设置mm <- jj*kk.即:
ff(2, 3, (jj*kk))
Run Code Online (Sandbox Code Playgroud)
这会产生:
Error in ff(2, 3, (jj * kk)) : object 'jj' not found
Run Code Online (Sandbox Code Playgroud)
mm在评估之前,即在成功评估之后jj,不会抛出此错误kk.因此,他们将使用不同的范围规则进行第二次评估.我知道这是R标准范围.我问,我可以用这样的方式编写函数,它允许我递给一个简单的数字,或者其他形式参数的函数,只要这些参数在mm需要之前已经或者可以被评估了
吗?
请注意,我不是在问我是否应该这样做.对于后一个问题提出意见的人,我会坚决地假装礼貌.
我也不会问我是否可以预先计算jj并预先计算出预先消化的数字.我知道这是一个看似合理的答案,但由于我已经简化了问题,它不起作用.