标签: language-specifications

是否在任何地方指定了lambda->表达式树转换过程?

在C#中编译LINQ查询有两个重要步骤.第一种是将LINQ查询语法转换为方法调用链,如C#语言规范的第7.16节所述.此转换过程详细指定,语言开发人员可以使用它在新的CLR语言上实现类似的查询语法.

第二步是将lambda表达式转换为表达式树,这在调用返回的查询方法时发生IQueryable,但在调用返回的方法时则不会IEnumerable.它是否曾经指明过这种转换是如何发生的,与查询语法转换过程的解释相似?

.net c# linq language-specifications

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

关于结构的问题

MSDN说,一个16字节或更少的类将更好地作为结构[引用]处理.
这是为什么?
这是否意味着如果一个结构超过16个字节,它的效率低于一个类或它是否相同?
你如何确定你的班级是否在16字节以下?
是什么限制了结构体像一个类一样?(除了禁止无参数构造函数)

c# struct class language-specifications

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

为什么这个C++显式模板特化代码是非法的?

(注意:我知道这是非法的,我正在寻找这种语言的原因.)

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).然而,这是一个非常弱的论点,因为在这种情况下,它不适用于两个原因:

  1. 将显式特化移动到另一个翻译单元可以解决问题,并且似乎没有违反ODR(或链接器说的那样).
  2. 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

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

VBA的语法(可能是BNF)规范?

我必须维护Access 2003 VBA代码的一部分,这不是我的主要编程语言,虽然我非常擅长做常规的东西,但我仍然希望有一个纯语言语法规范..它只是保存与阅读大量愚蠢的教程相比,这些教训很多,告诉我什么是for循环.

VBA语法上是否有任何资源?我很乐意让它尽可能正式,可能像BNF.我找不到官方的规格.

syntax vba bnf language-specifications

6
推荐指数
2
解决办法
1366
查看次数

C#'dynamic'关键字......它真的是一个RESERVED关键字,还是只是一个标识符,当用作类型时意味着什么特殊?

我有一个C#4.0解析器.它接受'dynamic'作为关键字作为类型.我的解析器会跳过以下形式的C#3.0程序中发现的语句:

dynamic = <exp> ;
Run Code Online (Sandbox Code Playgroud)

那么,它真的是动态关键字吗?或者它仍然可以用作任意标识符名称?(如果是这样,为什么'int'不是以同样的方式对待)?

是否有某个参考规范说明dynamic是否是关键字?最新的ECMA C#4规范甚至没有提到"动态",我在MS网站上找到的最好的是"初步规范",它说它是一个关键字,但我怀疑这只是草率的写作.

c# keyword language-specifications c#-4.0

6
推荐指数
2
解决办法
900
查看次数

F#语言参考文档是否以离线格式(PDF,CHM)提供?

我在hubFS上找到了几个 帖子,询问是否有F#的离线文档.这些帖子尚未得到答复.所以我想试一试,在这里问同样的问题.


到目前为止我在哪里寻找离线文档:


题:

有谁知道是否有任何"官方"离线文档即将推出?

(与此相关,甚至很难客观地回答:期望F#不会经历ECMA或ISO标准化是否合理,即可能不会有描述该语言的标准文档?)

documentation f# language-specifications

6
推荐指数
1
解决办法
1207
查看次数

什么是Scala 2.8规范§6.26.5Eta扩展中的"最大子表达式"?

Scala 2.8语言规范,§6.26.5EtaExpansion中,它声明我们需要一个最大子表达式,但是,没有找到这个的定义.有人可以澄清一下吗?

scala type-inference expansion language-specifications

6
推荐指数
1
解决办法
109
查看次数

Java 8类型推断 - 如何对通用构造函数进行简化?

我正在阅读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合并.

java type-inference language-specifications java-8

6
推荐指数
1
解决办法
202
查看次数

为什么Class.forName("BumpTest"),而不是BumpTest.class?

JLS Sec 8.4.3.6中,synchronized方法,它说:

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) {}
    }
}
Run Code Online (Sandbox Code Playgroud)

这对我来说很奇怪,更不用说过于复杂了:为什么要使用Class.forName("BumpTest"),不是BumpTest.class吗?不可能BumpTest没有加载,因为它毕竟是从该类执行代码.并按原样编写,检查ClassNotFoundException必须被捕获和吞下.

有没有特别的理由以这种方式写它?

java language-specifications

6
推荐指数
1
解决办法
84
查看次数

无法向Python添加新关键字

通过遵循此博客文章本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.cInclude/graminit.h并没有重新生成,并且根据我提到的PEP,它应该由来完成pgen,应该由来调用make。但是正如我前面提到的,我跑步了PCbuild/build.bat,但没有参加make。我尝试pgen手动运行,但是由于出现异常而失败ImportError: attempted relative import with no known parent package

因此,由于删除关键字的操作也失败了,所以我认为自定义Python的构建不正确(即使构建看起来很成功并且生成了python.exe)。是什么原因造成的?

编辑:我也试图删除该文件Grammar/Grammar并重建,并且该生成仍然有效。有点不对劲。

python windows language-specifications

6
推荐指数
0
解决办法
92
查看次数