此代码来自Bjarne Stroustrup的"C++编程语言"(C.13.8.3实例化绑定点)
template <class T>
void f(T value)
{
g(value);
}
void g(int v);
void h()
{
extern g(double);
f(2);
}
Run Code Online (Sandbox Code Playgroud)
他提到:
这里,f()的实例化点恰好在h()之前,因此在f()中调用的g()是全局g(int)而不是局部g(double)."实例化点"的定义意味着模板参数永远不能绑定到本地名称或类成员.
void h()
{
struct X {}; // local structure
std::vector<X> v; // error: can't use local structure as template parameter
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
为什么第一个代码有效?g()稍后声明,我真的得到了G ++ 4.9.2的错误,那时g没有声明.
extern g(double) - 这是如何工作的?因为在函数重载的情况下返回值无关紧要,那么我们可以在前向声明中错过它吗?
f()的实例化点就在h()之前 - 为什么?在f(2)被调用时它会被实例化是不合逻辑的?就在我们称之为的地方,它g(double)已经在范围内了.
"实例化点"的定义意味着模板参数永远不能绑定到本地名称或类成员 - 在C++ 14中是否已更改?我在使用C++(G ++ 4.9.2)时遇到错误,但是在C++ 14(G ++ 4.9.2)中没有出错.
我有以下代码,我在其中声明一个函数,然后是一个与函数同名的变量:
function a(x) {
return x * 2;
}
var a;
alert(a);
Run Code Online (Sandbox Code Playgroud)
我希望这能提醒undefined,但如果我运行它,警报将显示以下内容:
函数a(x){
return x*2
}
如果我为变量赋值(如var a = 4),则警报将显示该值(4),但如果没有此更改,a则会将其识别为函数.
为什么会这样?
需要帮助理解PEP 227和Python语言参考中的以下句子
如果在封闭范围中引用变量,则删除名称是错误的.编译器将为'del name'引发一个SyntaxError.
缺少示例导致我无法在编译时重现错误,因此非常需要使用示例进行解释.
考虑:
data Expr a
= V a
| Lit Integer
| Let (Expr a) (Expr (Maybe a))
deriving (Eq,Show)
Run Code Online (Sandbox Code Playgroud)
该Let构造使我以引用它在第二表达式(第一ARG)结合(V Nothing指它).
如果我做的事情
Let (Lit 3) $ Let (Lit 1) $ Var Nothing
Run Code Online (Sandbox Code Playgroud)
这Lit也将Var Nothing是指什么?此外,我想一次性推广到多个绑定,我不知道如何做到这一点.我从杰出的爱德华·凯梅特(Edward Kmett)绑定包中得到了一些例子,但现在我既困惑又迷失了.
在阅读http://www.effbot.org/zone/python-objects.htm后,我留下了这个问题:
在python中,如果a=1创建一个整数对象并将其绑定到名称a,b=[]创建一个空的列表对象并将其绑定到name b,当我调用eg时会发生什么c=[1]?
我想这会创建一个list-object并将其绑定到名称c,但是如何1处理呢?在引擎盖下,列表对象的实际内容是什么样的?它是由整数对象还是对"单独"整数对象的引用组成的?是否可以将其c[0]视为绑定到列表项的名称?
以下是什么:
d=1 # creates int(1)-object and binds it to d
e=[d] # creates list-object and binds it to e, but what happens with d?
Run Code Online (Sandbox Code Playgroud)
list-object(named e)的内容是对被调用的整数对象d或新的整数对象的引用吗?
我想答案就在于Lundh先生的引用,来自上面提到的来源,但我仍然有点困惑:
然后,您在该对象上调用一个方法,告诉它将一个整数对象附加到自身.这会修改列表对象的内容,但它不会触及命名空间,也不会触及整数对象.
此外,我相信部分答案可以在这里找到:Python; 名称绑定不是对象引用?,但我仍在寻找更多的见解.
我一直试图建立标记AST一段时间.我们来介绍一下这个问题:
data E a
= V a
| LitInt Int
| LitBool Bool
| FooIntBool (E a) (E a) -- er…
deriving (Eq,Show)
Run Code Online (Sandbox Code Playgroud)
对我来说,这段代码的问题在于FooIntBool.这个想法是它需要一个int表达式和一个bool表达式,并将它们粘合在一起.但E a可能是任何事情.鉴于以上定义,这将是有效的E:
FooIntBool (LitInt 3) (LitInt 0)
Run Code Online (Sandbox Code Playgroud)
你可以看到这个问题.然后,我们想要什么?标记的表达式.鉴于E的当前定义,这是不可能的,所以让我们介绍一些GADT:
data E :: * -> * -> * where
V :: a -> E l a
LitInt :: Int -> E Int a
LitBool :: Bool -> E Bool a
FooIntBool :: E Int a -> E …Run Code Online (Sandbox Code Playgroud) 我有这样的清单
a = [ [ 1,2,3 ], [ 4,5,6] ]
Run Code Online (Sandbox Code Playgroud)
如果我写
for x in a:
do something with x
Run Code Online (Sandbox Code Playgroud)
是否将第一个列表a复制到x?或者python是否使用迭代器执行此操作而不进行任何额外的复制?
我对以下示例的实例化问题感到困惑:
#include <iostream>
void f(int){std::cout<<"int"<<std::endl;}//3
template <typename T>
void g(T t)
{
f(t);//4
}
void f(double){std::cout<<"double"<<std::endl;}
int main()
{
g<int>(1);//1.point of instantiation for g<int>
g<double>(1.1);//2.point of instantiation for g<double>, so f(double) is visible from here?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我虽然f是一个从属名称,1是g <int>的实例化点,2是g <double>的实例化点,所以对于g(1.1),f(double)是可见的,但是输出是
int
int
Run Code Online (Sandbox Code Playgroud)
如果我在3处评论f(int)的声明,gcc报告错误(不是惊讶),并指出f(t)在4是实例化点(惊讶!!).
test.cpp: In instantiation of ‘void g(T) [with T = int]’:
test.cpp:16:10: required from here
test.cpp:9:5: error: ‘f’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation …Run Code Online (Sandbox Code Playgroud) 我对以下结果感到惊讶,使用Python 2.7.4:
>>> id(5)
5068376
>>> id(5)
5068376
Run Code Online (Sandbox Code Playgroud)
当评估表达式5时,创建一个具有5068376标识的新对象.现在,我希望重复相同的语句将创建另一个新对象,其标识将是唯一的,因为简单地评估表达式不会产生任何对对象和对象的引用应该是垃圾回收.
这并不是解释器重用相同的内存地址:
>>> id(6)
5068364
>>> id(5)
5068376
Run Code Online (Sandbox Code Playgroud)
什么给出了什么?翻译是否对文字进行幕后绑定?
我试图了解什么是Python名称绑定,以及何时解释此绑定.
在c中,
include <stdio.h>
int main()
{
int X = 42;
int* Y[1];
Y[0] = &X;
X = 666;
printf("%d", *Y[0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
打印666.我期待Python代码块:
X = 42
L = []
L.append(X) #3
X = 666
print(L) #5
Run Code Online (Sandbox Code Playgroud)
做同样的事情,但事实并非如此.标记为3和5的行之间到底发生了什么?#3是否对另一个称为"42"的对象进行引用,就像X一样,让它称之为X',并将X'存储在L指向的对象中,即[]?
我在一本关于语言描述的书中看到了这一点
On the other hand, a name can be bound to no object (a dangling pointer),
one object (the usual case), or several objects (a parameter name in a
recursive function).
Run Code Online (Sandbox Code Playgroud)
我们如何将名称绑定到多个对象?我们所谓的数组是不是所有元素具有相同的名称但具有索引?对于递归函数,如下例所示:
x = 0
def f(y):
global x
x += 1
if x < 4 :
y +=100
f(y)
else: return
f(100)
Run Code Online (Sandbox Code Playgroud)
名称是否y绑定了多个以递归方式创建的值,因为y名称表已经将名称绑定到初始值,并使用递归进行复制?
EDITED只需按下此处Visualizer并查看其生成的内容.:)