问题标签 [language-specifications]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
807 浏览

c# - 静态扩展方法和项目 Roslyn

这里已经注意到(而且非常正确),.NET 中的扩展方法只是实例变量上的静态方法调用的语法糖。

但是关于这个问题,我想知道为什么语言规范中省略了静态访问的扩展方法?

作为一名 .NET (C#) 开发人员,我也是一名 JavaScript 开发人员,您可以对 JavaScript 中的静态方法扩展等价物进行建模 - 因此我有理由深入研究这个论点。(我很清楚 .NET 和 JavaScript 是两种截然不同的语言!)

让我们检查一下扩展方法的语法以及它是如何编译的:

编译为

如果您尝试为静态类型创建变量

你不能!

如果您尝试将静态类型作为方法参数传递

你不能!

所以这定义了语言规范的限制,但是就扩展方法而言,我可以看到实现是沿着这些方向的......

好吧,这不可能……我为什么还要问?答案...“罗斯林计划”。您认为这是我们可能会在 Roslyn 项目中实现的所有其他语言规范更改中看到的东西吗?

编辑任何对 Roslyn 语言扩展感兴趣的人都应该观看:https ://channel9.msdn.com/Events/Build/2014/2-577

0 投票
1 回答
661 浏览

c# - System.Array.Clone() 是否保证克隆值类型?

这工作正常。Clone()做一个浅拷贝,但是数组类型是值类型,所以它们也被克隆了。

我的问题是这是否在语言规范中是明确的,或者这是否只是当前实现的产物?

我的怀疑是由于System.Array通过运行时泛型在幕后“无形地”支持值类型。查看公共方法,您会期望值类型被装箱。

0 投票
1 回答
191 浏览

scheme - 语法规则表达式本身是否评估为 Scheme 中的值?

在 Chibi 和 CHICKEN 中,以下syntax-rules表达式计算为一个过程:

这只是这些特定实现如何编写的产物吗?Scheme 语言规范似乎没有要求syntax-rules能够评估为一个值。


更新

看来这可能取决于 Scheme 的版本?

来自 R 6 RS 规范

语义:语法规则的实例在宏扩展时通过指定一系列卫生重写规则来评估新的宏转换器。一个宏的使用,其关键字与由 syntax-rules 指定的转换器相关联,与 s 中包含的模式相匹配,从最左边的 开始。找到匹配项后,将根据模板卫生地转​​录宏使用。找不到匹配项时,这是语法冲突。

来自R 5 RS 规范R 7 RS 规范

语义:语法规则的一个实例通过指定一系列卫生重写规则来生成一个新的宏转换器。使用关键字与由 syntax-rules 指定的转换器相关联的宏与语法规则中包含的模式相匹配,从最左边的语法规则开始。找到匹配项后,将根据模板卫生地转​​录宏使用。

0 投票
2 回答
213 浏览

f# - 为什么函数内部允许“做”?

我注意到以下代码在 VS 2013 中编译并运行:

但是在查看 F# 3.0 规范时,我找不到任何提及以do这种方式使用的内容。据我所知,do可以有以下用途:

  • 作为循环的一部分(例如),这里不是这种情况。while expr do expr done
  • 内部计算表达式,例如:

    这里也不是这种情况,f不包含任何计算表达式。

    虽然这里让我感到困惑的是,根据规范,do应该跟在in. in由于轻量级语法,这应该是可选的,但在此处添加它会导致编译错误(“Unexpected token 'in' or incomplete expression”)。

  • 模块或类中的语句。这里也不是这种情况,do它在函数内部,而不是在模块或类内部。

我还注意到,使用#light "off",代码无法编译(“Unexpected keyword 'do' in binding”),但我也没有在轻量级语法部分找到任何可以解释这一点的内容。

基于这一切,我假设以do这种方式在函数内部使用不应该编译,但确实如此。我错过了规范中的某些内容吗?或者这实际上是编译器或规范中的错误?

0 投票
2 回答
174 浏览

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

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

第二步是将 lambda 表达式转换为表达式树,这发生在调用返回的查询方法时IQueryable,而不是调用返回的方法时IEnumerable。它是否曾经指定过这种转换是如何发生的,类似于查询语法转换过程的解释?

0 投票
1 回答
210 浏览

scala - 根据 Scala 语言规范,包是 AnyRef 值并具有类型。这有什么意义?

我正在阅读 Scala 语言规范,我遇到了一些令人困惑的事情,即包是值并且它们确实具有类型的含义。

以下是我从 Scala 语言规范中得出的结论(可能是错误的?)这个奇怪的事实:

背景:

类型指示符部分,它是这样写的:

SimpleType ::= StableId

类型指示符是指命名值类型。它可以是简单的或合格的。所有这些类型指示符都是类型投影的简写。

具体来说,将 t 绑定在某个类、对象或包 C中的非限定类型名称 t被视为C.this.type#t 的简写。如果 t 未绑定在类、对象或包中,则 t 被视为 ε.type#t 的简写。

限定类型指示符具有 pt 形式,其中 p 是路径,t 是类型名称。这样的类型指示符等价于类型投影 p.type#t。

下面列出了一些类型指示符及其扩展。我们假设一个本地类型参数 t,一个带有类型成员 Node 和标准类 scala.Int的值maintable,

在此处输入图像描述

此外,通过考虑类型投影定义:

SimpleType ::= SimpleType '#' id

类型投影T#x 引用类型 T 的名为 x 的类型成员

最后,单例类型定义说:

SimpleType ::= 路径 '.' 类型

单例类型的形式为 p.type,其中 p 是指向预期符合 scala.AnyRef 的值的路径。类型表示由 null 和 p 表示的值组成的值的集合。

推理链:

所以,我们知道:

1) scalainscala.Int是一个包。

2)scala.Int只是语法糖scala.type#Int(如类型指示符定义中所述,如上图所示)

3)scala.type#Int是类型投影,其中scala.type必须是根据类型投影定义的类型,其中规定:

类型投影 T#x 引用类型 T 的名为 x 的类型成员。

4)scala.type类型也是如此!也就是说,它是一个单例类型,根据单例类型的定义,它说:

单例类型的形式为 p.type,其中 p 是指向预期符合 scala.AnyRef 的值的路径。

5)scala对应p哪个是符合AnyRef的

6)在这里的Scala语言规范中写道:

Scala 中的每个值都有一个类型...

7)所以包scala有一个类型。

问题

1)这个推理正确吗?包scala真的是符合 AnyRef 的值吗?如果这个推理不正确,请解释原因。

假设上面的推理是正确的并且包scala确实是一个值:

2) 包裹在什么意义上是scala有价值的?这有什么意义呢?在什么情况下,我们可以将值视为与类型scala相同5:Int的值?5Int

3)如果包scala是符合AnyRef的值,那么我应该能够将该值放入变量中,我可以这样做,如果不是,那为什么不呢?

4) 包的价值是如何scala在幕后内部(由编译器)表示的?它是一个对象吗?这个值在运行时是否以 JVM 对象的形式存在?如果是,我怎样才能得到它?我怎样才能调用toString它的方法?

0 投票
2 回答
96 浏览

c++ - 使用“this->”区分构造函数中的变量名

我记得我曾经能够做到这一点并让它按预期工作:

我相信,以上在 Microsoft Visual C++ 6.0 和一些更高版本上的工作时间约为 200 倍。
但现在我必须在 Microsoft Studio 2013 上执行此操作,并且必须使用this->,例如:

是否有语言规范更改或 Microsoft 编译器更改?

0 投票
1 回答
198 浏览

scala - 这是关于参数化类型的 Scala 语言规范中的错字吗?

U_i不应该是T_i,如下图所示吗?

同样的错字(恕我直言)也在这里

在此处输入图像描述

如果这不是错字,那么有人可以告诉我 T_i 的含义在哪里指定吗?

0 投票
1 回答
839 浏览

svg - SVG 路径规范:moveTo 和隐式 lineTo

我正在尝试编写一个小 SVG 路径解析器/规范化器,并遇到了规范的最后一个问题:

据我了解,大多数命令都支持额外的隐式命令,当它们这样做并且处于相对模式时,“当前点”将在最后一个隐式命令之后更新,而不是在它们之间。

但是“moveTo”命令有些特殊,它允许隐含的“lineTo”命令。而“lineTo”命令它自己只会在最后一个隐式命令之后更新“当前点”:

从当前点到给定的 (x,y) 坐标画一条线,该坐标成为新的当前点。L(大写)表示后面跟着绝对坐标;l(小写)表示后面跟着相对坐标。可以指定多个坐标对来绘制折线。在命令结束时,新的当前点设置为提供的最后一组坐标。

我不确定带有附加“lineTo”的“moveTo”是做什么的。SVG 路径规范的摘录:

在给定的 (x,y) 坐标处开始一个新的子路径。M(大写)表示后面跟着绝对坐标;m(小写)表示将跟随相对坐标。如果 moveto 后跟多对坐标,则后续对将被视为隐式 lineto 命令。因此,如果 moveto 是相对的,则隐式 lineto 命令将是相对的,如果 moveto 是绝对的,则将是绝对的。如果相对 moveto (m) 作为路径的第一个元素出现,则将其视为一对绝对坐标。在这种情况下,即使初始 moveto 被解释为绝对 moveto,后续的坐标对也被视为相对坐标。

尤其是最后一句话,令人费解。

更糟糕的是,他们在SVGTiny Path Spec中写了另一个描述,而几乎所有其他内容都是一样的:

将在给定 (x,y) 坐标处开始一条新的子路径。这也应在给定坐标处建立一个新的当前点。如果相对“moveto”(m)作为“路径”的第一个元素出现,则应将其视为一对绝对坐标。如果 'moveto' 后跟多对坐标,则后续对将被视为隐含的 'lineto' 命令。

这是否意味着“当前点”在两者之间进行了更新(这将与其他所有内容不一致)还是只是他们在较新版本中更正的模棱两可的描述?

0 投票
1 回答
116 浏览

json - JSON encoding details

I was reading JSON's succinct language specification and got surprised for this sentence:

Excepting a few encoding details, that completely describes the language.

What are the details which can break those simple rules.