2

F# 规范在语法中做了以下定义(第 A.1.4.1 节):

ident-char :
      letter-char
      digit-char
      connecting-char
      combining-char
      formatting-char
      '
      _

定义connecting-char

connecting-char : '\Pc'

我相信这意味着connecting-char任何c满足

System.Globalization.CharUnicodeInfo.GetUnicodeCategory(c) = UnicodeCategory.   ConnectorPunctuation

当您对此进行测试时,_您会得到:

> System.Globalization.CharUnicodeInfo.GetUnicodeCategory('_');;
val it : System.Globalization.UnicodeCategory = ConnectorPunctuation

我认为这意味着这_是一个有效的connecting-char. 这就提出了一个问题,为什么_.

在实际的编译源代码中,没有特殊处理_

(来自https://github.com/fsharp/fsharp/blob/master/src/fsharp/lex.fsl),

let ident_char =
    letter
  | connecting_char
  | combining_char
  | formatting_char
  | digit
  | ['\'']

那么问题来了 - 为什么 F# 规范有_in ident-char 的条目?

4

1 回答 1

1

我预计这将是出于历史原因(继承自 F# 在 SML 中的根源)或明确包含下划线(正如典型标识符规则所预期的那样:下划线或字母后跟零个或多个下划线或字母数字) .

(但这是推测性的,要获得真正的答案,为什么不问 F# 团队?)

于 2012-09-22T10:38:59.857 回答