Preface
前文我们为编写Nim代码打好了编辑器基础。
Getting Started
开始之前,我们需要记住一些注意事项(或称规范)。
1.缩进机制
Nim 是缩进敏感的语言,通过缩进的层次控制语言的逻辑结构。缩进只能使用空格符,不能使用制表符,使用制表符也会被当成空格处理。
2.注释
类别 | 开始标记 | 备注
------- | --------
代码注释 | # | 可以出现在文档中的任何位置
文档注释 | ## | 只能出现在文档中的特定位置 (以后我们会学到)
3.标识符和关键字
标识符规范
标识符是字母、数字、下划线组成的字符串,Nim规定第一个必须是字母,另外,双下划线 __ 是不允许的。 <br />
关键字
下面的关键字是保留的,不能用作标识符:
adds and as asm atomic
bind block break
case cast concept const continue converter
defer discard distinct div do
elif else end enum except export
finally for from func
generic
if import in include interface is isnot iterator
let
macro method mixin mod
nil not notin
object of or out
proc ptr
raise ref return
shl shr static
template try tuple type
using
var
when while with without
xor
yield
标识符等价
如果下面的算法返回true
,则此两个标识符就是定价的:
proc sameIdentifier(a, b: string): bool =
a[0] == b[0] and
a.replace(re"_|–", "").toLower == b.replace(re"_|–", "").toLower
除了首字母是严格比较的,其余部分采用不严格比较。除了首字母,其余部分不存在大小写区分,下划线会被忽略。这表示 foo,f_Oo,f_o_O,fOO 都是等价的标识符。
首字母是区分大小写的,这样可以比较容易的避开var foo: Foo
这种代码引起的歧义。
<br />
4、字符串字面值
- 双引号
字符串字面值使用双引号 " 进行包裹,可以包含下列转义字符:<br />
转义字符 | 描述 |
----|-----
\\\\n
| 新行符 newline
\\\\r
,\\\\c
| 回车符 carriage return
\\\\l
| 换行符 line feed
\\\\f
| 换页符 form feed
\\\\t
| 制表符 tabulator
\\\\v
| 垂直制表符 vertical tabulator
\\\\\\\\
| 反斜杠 backslash
"
| 双引号 quotation mark
\\\\'
| 单引号 apostrophe
\\\\ '0'..'9'+
| 十进制数值字符
\\\\a
| 告警符 alert
\\\\b
| 退格符 backspace
\\\\e
| 取消符 escape [ESC]
\\\\x HH
| 十六进制数值字符;刚好两个十六进制数字
- 三引号
三引号字符串值使用 """ 包裹。可以在三引号字符串中包含多个行。和普通字符串字面值不同,语法解析器不对三引号字符串字面值中的字符进行转义,比如:
""""long string within quotes
Then""""
会被生成值:
"long string within quotes\\\\nThen"
5、数字常量
数字常量可以使用下划线来增加可读性。整数和浮点数的值可以是十进制(无前缀)、二进制(前缀 0b)、八进制(前缀 0o 或者 0c)、十六进制(前缀 0x)。
6、操作符
Nim 语言允许用户定义操作符。操作符是下列字符的任意组合:
= + - * / < >
@ $ ~ & % |
! ? ^ . : \\\\
这些关键字也同样是操作符:
and or not xor shl shr div mod in notin is isnot of
Conclusion
今天好歹介绍了一些Nim的词法规范。Part 4将正式进入语法阶段,敬请期待。