Nix 语言中有效标识符的语法是什么?

What is the syntax of a valid identifier in the Nix language?

在任何地方都找不到语言规范,基本上 Nix Pills 中的 Nix source? The repo's README refers to the Nix manual, but it seems incomplete. For example, 4.2. Identifiers 提到可以使用破折号 (-),而手册甚至从未提及标识符语法。


更新:刚刚发现已经关闭(且未解决)NixOS/nix 问题 #592 没有关于有效 symbol/variable 名称的文档

可能有更好的参考资料,但至少你可以查看 lexer 的来源,它定义了一个标识符

ID          [a-zA-Z\_][a-zA-Z0-9\_\'\-]*

作为由 ASCII 字母、数字、_'- 组成的字符串,并以字母或 _.[=20 开头=]


(更新:这引用了 out-of-date 参考语法,而不是工作语法。)

根据 grammar,标识符不能包含 -:

  <production id="nix.id">
    <lhs>Id</lhs>
    <rhs>[a-zA-Z\_][a-zA-Z0-9\_\']*</rhs>
  </production>

但路径可以:

  <production id="nix.path">
    <lhs>Path</lhs>
    <rhs>[a-zA-Z0-9\.\_\-\+]*(\/[a-zA-Z0-9\.\_\-\+]+)+</rhs>
  </production>

我不完全确定是什么评估过程导致 REPL 将语法上有效的路径报告为未定义变量。