标签: scoping

Common Lisp范围(动态与词汇)

编辑:我在第一个答案后更改了示例代码,因为我提出了一个简单的版本,提出相同的问题.

我目前正在学习Common Lisp的范围属性.在我认为我有一个扎实的理解后,我决定编写一些我可以预测结果的例子,但显然我错了.我有三个问题,每个问题都与下面的例子有关:

例1:

(defmethod fun1 (x)
  (print x)
  (fun2))

(defmethod fun2 ()
  (print x))

(fun1 5)
Run Code Online (Sandbox Code Playgroud)

输出:

5 
*** - EVAL: variable X has no value
Run Code Online (Sandbox Code Playgroud)

问题:这是有道理的.x是静态范围的,fun2无法在没有显式传递的情况下找到x的值.

例2:

(defvar x 100)

(defmethod fun1 (x)
  (print x)
  (fun2))

(defmethod fun2 ()
  (print x))

(fun1 5)
Run Code Online (Sandbox Code Playgroud)

输出:

5
5
Run Code Online (Sandbox Code Playgroud)

问题:我不明白为什么x对fun2突然可见,其值为fun1,而不是值为100 ...

例3:

(setf x 100)

(defmethod fun1 (x)
  (print x)
  (fun2))

(defmethod fun2 ()
  (print x))

(fun1 5)
Run Code Online (Sandbox Code Playgroud)

输出:

5
100
Run Code Online (Sandbox Code Playgroud)

问题:我是否应该忽略这些结果,因为在未声明的变量上调用setf显然是未定义的?这恰好是我在第二个例子中所期望的......

任何见解将不胜感激......

lisp dynamic common-lisp scoping lexical

10
推荐指数
1
解决办法
2890
查看次数

Python在词典理解中的范围

>>> x = 'foo'
>>> {0: locals().get('x')}
{0: 'foo'}
>>> {0: locals().get('x' + spam) for spam in ['']}
{0: None}
Run Code Online (Sandbox Code Playgroud)

这种行为差异的原因是什么?

python scoping locals

10
推荐指数
1
解决办法
304
查看次数

在 Julia 中,为什么局部作用域中的“if false”语句可以修改函数定义?

在 Julia 1.4.1 中,如果我在全局范围内定义一个函数,“if false”语句之后的修改不会影响它,正如预期的那样:

test()=0
if false
  test()=1
end

println(test())
Run Code Online (Sandbox Code Playgroud)

这应该打印“0”。但是,当我将此代码包含在本地范围内时,行为会发生变化:

function main()
  test()=0
  if false
    test()=1
  end

  println(test())
end

main()
Run Code Online (Sandbox Code Playgroud)

现在打印出我没想到的“1”。如果我将“测试”更改为数组或浮点数,我不会按预期观察到任何修改,即问题不会发生。为什么 Julia 对函数有这种行为?

function scoping julia

10
推荐指数
1
解决办法
77
查看次数

JavaScript本地范围:var vs. this

我似乎无法理解JavaScript变量的特定范围.与我发现的其他示例和问题不同,我对嵌套函数的范围感兴趣.

我在这个JSFiddle上建立了一个例子.相关部分如下:

function MyObject() {
    var self = this;

    var a = 1;
    this.b = 2;

    var innerMethod = function() {
        //1 and 2: direct reference
        logMessage("a = " + a); // a = 1
        //logMessage("b = " + b); // Error: b is not defined

        //3 and 4: using this
        logMessage("this.a = " + this.a); // this.a = undefined
        logMessage("this.b = " + this.b); // this.b = undefined

        //5 and 6: using self
        logMessage("self.a = " + …
Run Code Online (Sandbox Code Playgroud)

javascript scope scoping

9
推荐指数
1
解决办法
2498
查看次数

python noobie范围问题

我写了这段代码:

x = 0
def counter():
 x = 1
 def temp(self):
  print x
  x += 1
 return temp
Run Code Online (Sandbox Code Playgroud)

试图测试python是词法还是动态范围.我的想法是这样的

y = counter()
y()
Run Code Online (Sandbox Code Playgroud)

应该打印0或1,这将告诉我python如何作用域.但是,调用y会抛出一个异常,说x未定义.在理解Python如何工作的过程中,似乎存在一些根本性的缺陷.

谁能解释一下这是如何工作的?是的,我知道可以使用对象轻松完成.我正试图探索在不使用对象的情况下给出函数状态的想法.我用这种方式编写代码是因为上面翻译成像SCI这样的词汇范围的语言肯定会有效.

python scoping

8
推荐指数
3
解决办法
3361
查看次数

RStudio中的错误代码诊断报告,当通过源获取功能时

我在RStudio工作的一个简单的分析,我通过source命令来源一些文件.例如,我有一个简单的分析这个文件:

analysis.R

# Settings ----------------------------------------------------------------

data("mtcars")
source("Generic Functions.R")

# Some work ---------------------------------------------------------------

# Makes no sense
mtcars$mpg <- CleanPostcode(mtcars$mpg)
Run Code Online (Sandbox Code Playgroud)

泛型函数文件有我用它来获得图形,做重复的任务一些简单的功能.例如,使用的CleanPostcode函数看起来像这样:

通用函数.R

#' The file provides a set of generic functions 

# String manipulations ----------------------------------------------------

# Create a clean Postcode for matching
CleanPostcode <- function(MessyPostcode) {
  MessyPostcode <- as.character(MessyPostcode)
  MessyPostcode <- gsub("[[:space:]]", "", MessyPostcode)
  MessyPostcode <- gsub("[[:punct:]]", "", MessyPostcode)
  MessyPostcode <- toupper(MessyPostcode)
  cln_str <- MessyPostcode
  return(cln_str)
}
Run Code Online (Sandbox Code Playgroud)

当我运行第一个文件时,对象在全局环境中可用:

全球环境

文件中还有一些其他功能,但它们与描述的问题无关.

然而,RStudio认为对象在范围内不可用,如代码旁边的黄色三角形所示:

问题

有没有办法让RStudio停止这样做.也许改变source命令的东西?我试过local …

environment r scoping rstudio

8
推荐指数
0
解决办法
199
查看次数

R 中的作用域和评估函数

鉴于以下功能

f <- function(x) {
    g <- function(y) {
            y + z
    }
    z <- 4
    x + g(x)
 }
Run Code Online (Sandbox Code Playgroud)

如果在 R 中运行以下代码,为什么答案是 10?我对 y 如何处理这个问题有点困惑。

z <- 10
f(3)
Run Code Online (Sandbox Code Playgroud)

r scoping

8
推荐指数
1
解决办法
190
查看次数

使用以编程方式构造的公式有任何陷阱吗?

我想要通过一长串潜在的解释变量,依次回归每个反应变量.而不是粘贴模型公式,我正在考虑使用reformulate(), 如此处所示.

fun()下面的功能似乎完成了工作,适合所需的模型.但请注意,它在其call元素中记录了构造的公式对象的名称而不是其.

## (1) Function using programmatically constructed formula
fun <- function(XX) {
    ff <- reformulate(response="mpg", termlabels=XX)
    lm(ff, data=mtcars)
}
fun(XX=c("cyl", "disp"))
# 
# Call:
# lm(formula = ff, data = mtcars)                 <<<--- Note recorded call
# 
# Coefficients:
# (Intercept)          cyl         disp  
#    34.66099     -1.58728     -0.02058  

## (2) Result of directly specified formula (just for purposes of comparison)
lm(mpg ~ cyl + disp, data=mtcars)
# 
# Call:
# lm(formula = …
Run Code Online (Sandbox Code Playgroud)

r scoping

7
推荐指数
1
解决办法
419
查看次数

R Shiny中的环境

http://shiny.rstudio.com/articles/scoping.html上,很好地解释了有光泽的范围规则.有3个环境或级别彼此嵌套:函数内,会话内和所有会话中可用的对象.使用< - 将更改您所在环境中的对象,<< - 将全局更改它,即对于所有会话.

如果我在会话中定义变量但想要在函数中更改它,该怎么办?

< - 只会在函数内更改它,因此其他函数无法读取,<< - 将为所有会话更改它.中间什么都没有?就像"只是一级"?

environment r scoping shiny

7
推荐指数
1
解决办法
4299
查看次数

无法在 Python 3 的列表理解中使用 locals() 吗?

下面的代码适用于 Python 2,但不适用于 Python 3。有没有办法在 Python 3 中访问局部变量?或者这些情况的替代解决方案?

[('{name_var}_{i:02d}of{maxpg:02d}.{date_var}').format(i, **locals()) 
  for i in range(start, end)]
Run Code Online (Sandbox Code Playgroud)

Python 3 中的错误:

关键错误:'local_var'

下面是上面的一个更简单的玩具示例(适用于 Python 2,但不适用于 3)

local_var = 'hello'
['{local_var}'.format(**locals()) for i in range(1)]
Run Code Online (Sandbox Code Playgroud)

Python 3 中的错误:

关键错误:'local_var'

python scope list-comprehension scoping python-3.x

7
推荐指数
1
解决办法
1301
查看次数