在C#中编译LINQ查询有两个重要步骤.第一种是将LINQ查询语法转换为方法调用链,如C#语言规范的第7.16节所述.此转换过程详细指定,语言开发人员可以使用它在新的CLR语言上实现类似的查询语法.
第二步是将lambda表达式转换为表达式树,这在调用返回的查询方法时发生IQueryable
,但在调用返回的方法时则不会IEnumerable
.它是否曾经指明过这种转换是如何发生的,与查询语法转换过程的解释相似?
MSDN说,一个16字节或更少的类将更好地作为结构[引用]处理.
这是为什么?
这是否意味着如果一个结构超过16个字节,它的效率低于一个类或它是否相同?
你如何确定你的班级是否在16字节以下?
是什么限制了结构体像一个类一样?(除了禁止无参数构造函数)
(注意:我知道这是非法的,我正在寻找这种语言的原因.)
template<class c> void Foo(); // Note: no generic version, here or anywhere.
int main(){
Foo<int>();
return 0;
}
template<> void Foo<int>();
Run Code Online (Sandbox Code Playgroud)
错误:
error: explicit specialization of 'Foo<int>' after instantiation
Run Code Online (Sandbox Code Playgroud)
谷歌的快速传递发现了这个规范的引用,但这只提供了什么,而不是原因.
编辑:
一些回复转发了这一论点(例如证实了我的推测),即规则是这样的,因为否则会违反一个定义规则(ODR).然而,这是一个非常弱的论点,因为在这种情况下,它不适用于两个原因:
Foo<int>
不能定义模板的泛型特化,因为没有专用的泛型体.关于此事的猜测:
关于为什么规则存在的猜测:如果第一行提供了一个定义(而不是一个声明),实例化后的显式特化将是一个问题,因为你会得到多个定义.但在这种情况下,唯一的定义是明确的专业化.
奇怪的是,以下(或者我正在处理的实际代码中的类似内容)有效:
文件A:
template<class c> void Foo();
int main(){
Foo<int>();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
档案B:
template<class c> void Foo();
template<> void Foo<int>();
Run Code Online (Sandbox Code Playgroud)
但总的来说,使用它开始创造一个意大利面条进口结构.
c++ templates language-specifications explicit-specialization
我必须维护Access 2003 VBA代码的一部分,这不是我的主要编程语言,虽然我非常擅长做常规的东西,但我仍然希望有一个纯语言语法规范..它只是保存与阅读大量愚蠢的教程相比,这些教训很多,告诉我什么是for循环.
VBA语法上是否有任何资源?我很乐意让它尽可能正式,可能像BNF.我找不到官方的规格.
我有一个C#4.0解析器.它接受'dynamic'作为关键字作为类型.我的解析器会跳过以下形式的C#3.0程序中发现的语句:
dynamic = <exp> ;
Run Code Online (Sandbox Code Playgroud)
那么,它真的是动态关键字吗?或者它仍然可以用作任意标识符名称?(如果是这样,为什么'int'不是以同样的方式对待)?
是否有某个参考规范说明dynamic是否是关键字?最新的ECMA C#4规范甚至没有提到"动态",我在MS网站上找到的最好的是"初步规范",它说它是一个关键字,但我怀疑这只是草率的写作.
我在hubFS上找到了几个 帖子,询问是否有F#的离线文档.这些帖子尚未得到答复.所以我想试一试,在这里问同样的问题.
到目前为止我在哪里寻找离线文档:
在视觉F#(2.0版)2010年4月CTP版本可用于VS 2008,但说到没有脱机帮助.
关于各种编程语言的离线文档有一个关于SO的问题,但在撰写本文时没有提及F#.
当然有Microsoft的F#语言参考文档(可在MSDN上获得),可以使用例如下载进行离线浏览wget
.
题:
有谁知道是否有任何"官方"离线文档即将推出?
(与此相关,甚至很难客观地回答:期望F#不会经历ECMA或ISO标准化是否合理,即可能不会有描述该语言的标准文档?)
在Scala 2.8语言规范,§6.26.5EtaExpansion中,它声明我们需要一个最大子表达式,但是,没有找到这个的定义.有人可以澄清一下吗?
我正在阅读java 8语言规范类型推断.它说
List<String> ls = new ArrayList<>()
Run Code Online (Sandbox Code Playgroud)
将首先减少
ArrayList<?> -> List<String>
Run Code Online (Sandbox Code Playgroud)
然后到
? <= String
Run Code Online (Sandbox Code Playgroud)
最后到
? = String
Run Code Online (Sandbox Code Playgroud)
我很难理解减少约束的方式
ArrayList<?> -> List<String> to ? <= String
Run Code Online (Sandbox Code Playgroud)
是派生的.如果有人能够使用java 8语言规范指出逻辑,那将是一个很大的帮助.
这是减少的链接
谢谢#Holger的解释.以下是我的推导
new ArrayList<> -> List<String> to ArrayList<?> -> List<String>
Run Code Online (Sandbox Code Playgroud)
如果我错了,请纠正我.
首先找到我们使用的构造函数的临时方法#15.9.3
否则,构造函数的参数是类实例创建表达式的参数列表中的参数(如果有),它们按照它们在表达式中出现的顺序.
如果类实例创建表达式使用<>来删除类类型参数,则为了重载解析和类型参数推断而定义方法列表m1 ... mn.
然后使用#18.5.2导出
ArrayList<?> -> List<String>
Run Code Online (Sandbox Code Playgroud)
因为是poly表达式而且没有任何通配符类型参数;
- 否则,约束公式<Rθ→T>减小并与B2合并.
在JLS Sec 8.4.3.6中,synchronized
方法,它说:
Run Code Online (Sandbox Code Playgroud)class BumpTest { // ... static synchronized void classBump() { classCount++; } }
具有与以下完全相同的效果:
Run Code Online (Sandbox Code Playgroud)class BumpTest { // ... static void classBump() { try { synchronized (Class.forName("BumpTest")) { classCount++; } } catch (ClassNotFoundException e) {} } }
这对我来说很奇怪,更不用说过于复杂了:为什么要使用Class.forName("BumpTest")
,不是BumpTest.class
吗?不可能BumpTest
没有加载,因为它毕竟是从该类执行代码.并按原样编写,检查ClassNotFoundException
必须被捕获和吞下.
有没有特别的理由以这种方式写它?
通过遵循此博客文章和本PEP,我尝试为Python添加新的关键字(新的流程语句)。根据我提到的PEP,我很确定我已经添加了需要添加到正确位置的内容。这些是我修改过的文件:
Grammar/Grammar
Parser/Python.asdl
Python/ast.c
Python/Python-ast.c
Python/Python-ast.h
Python/symbtable.c
Python/compile.c
Run Code Online (Sandbox Code Playgroud)
我在Windows上执行此操作,因此make
我没有运行而是运行了PCbuild/build.bat
。构建似乎是成功的。但是,当我运行新构建的时python.exe
,我的关键字未被识别(NameError: name [...] is not defined
)。
作为一项健全性测试,我试图通过break_stmt
从中删除Grammar/Grammar
并重新运行来从Python中删除break语句PCbuild/build.bat
。break语句工作得很好,这意味着删除失败。
我还注意到这些文件Include/graminit.c
和Include/graminit.h
并没有重新生成,并且根据我提到的PEP,它应该由来完成pgen
,应该由来调用make
。但是正如我前面提到的,我跑步了PCbuild/build.bat
,但没有参加make
。我尝试pgen
手动运行,但是由于出现异常而失败ImportError: attempted relative import with no known parent package
。
因此,由于删除关键字的操作也失败了,所以我认为自定义Python的构建不正确(即使构建看起来很成功并且生成了python.exe
)。是什么原因造成的?
编辑:我也试图删除该文件Grammar/Grammar
并重建,并且该生成仍然有效。有点不对劲。