作者: Andreas Rumpf
版本: 0.11.2
原文链接:http://nim-lang.org/docs/tut1.html
翻译:
信阳师范学院 高踪 任真 杨汝生 谢锋 黄式东
信阳职业技术学院 刘晓亚
前言
“Der Mensch ist doch ein Augentier – schöne Dinge wünsch ich mir.”
“人是视觉动物–我渴望美好事物。”
本文是编程语言Nim的教程。本教程假定您熟悉基本的程序设计概念,如变量、类型或非常基本的语句。手册(译注:指《Nim Manual》)中包含有更多的高级语言特性的例子。
第一个程序
我们从修改“Hello world”程序开始本教程:
#注释
echo("请问尊姓大名? ")
var name: string = readLine(stdin)
echo("你好, ", name, "!")
将代码保存为“greetings.nim”文件。现在编译并运行之:
nim compile --run greetings.nim
如果带有-run开关选项,Nim在编译后会自动执行文件。你可以在你的程序的文件名之后加上命令行参数:
nim compile --run greetings.nim 参数1 参数2
通常使用简写的命令和开关项,所以您也可以使用如下命令编译运行之:
nim c -r greetings.nim
编译发行版本使用:
nim c -d:release greetings.nim
在默认情况下,Nim编译器针对你的调试喜好生成大量运行时检查。加上-d:release这些检查被关闭而优化选项被打开。
虽然程序是显而易见的,我还是解释一下语法:当程序启动时不缩进的语句被执行。缩进是Nim的语句分组方式。缩进仅使用空格,制表符不被允许。
字符串字面量被双引号包围。var语句声明一个名叫name字符串型新变量,它具有 readline 过程返回的值。由于编译器知道readLine返回一个字符串,故可省略类型声明(称之为本地类型推断)。所以这样也行:
var name = readLine(stdin)
注意,基本上这是Nim的类型推断的唯一形式:它是简洁性和可读性之间的一个很好的折中。
“hello world”程序包含一些编译器已知的标识符:echo、readLine等等。这些内置过程声明在系统模块中,所有其它模块均隐式导入它们。
词汇(Lexical elements)
让我们更详细地看看Nim的词汇:如同其他编程语言一样,Nim包括(字符串)字面量、标识符、关键字、注释、运算符和其他标点符号。
字符串和字符字面量(String and character literals)
字符串字面值是括在双引号中;字符字面值括在单引号中。特殊字符用\转义:
\n意思是换行,\t是制表符(跳格键)等等。还有原字符串字面值(译注:注意下面的r前缀):
r"C:\program files\nim"
注释
注释是在字符串或字符字面量之外任何地方以#开始的。文档注释以##开始:
# A comment.
var myVariable: int ## a documentation comment
因为文档注释符归属于语法树,所以只能放在输入文件中特定的地方!此特性简化了文档生成器。
你也可使用discard(舍弃)语句结合长字符串字面量创建注释块:
discard """ You can have any Nim code text commented
out inside this with no indentation restrictions.
yes("May I ask a pointless question?") """
数值
数值字面量的写法和大多数其它语言一样。为了良好的可读性,下划线被允许用作特殊的连接:1_000_000(一百万)。包含点(或‘e’或‘E’)的数是浮点数字面量:1.0e9(十亿)。十六进制字面量前缀0x ,二进制字面量前缀0b而八进制字面量前缀为0o。前导零不能生成八进制数。
var语句
Var语句声明一个新的局部变量或全局变量:
var x, y: int # declares x and y to have the type ``int``
关键字var后使用缩进可以列表整个变量段落:
var
x, y: int
# a comment can occur here too
a, b, c: string
赋值语句
赋值语句赋新值给一个变量或更一般的存储位置:
var x = "abc" # introduces a new variable `x` and assigns a value to it
x = "xyz" # assigns a new value to `x`
=是赋值运算符。运算符不能被重载、覆盖或禁止,但这在将来的Nim版本中也许有变化。你可以只用一条单独的赋值语句声明多个变量,它们都有相同的值:
var x, y = 3 # assigns 3 to the variables `x` and `y`
echo "x ", x # outputs "x 3"
echo "y ", y # outputs "y 3"
x = 42 # changes `x` to 42 without changing `y`
echo "x ", x # outputs "x 42"
echo "y ", y # outputs "y 3"
注意,声明多个变量只用一条赋值语句而又调用过程,可能会有意想不到的结果:编译器将展开这些赋值,最终调用过程多次。如果过程的返回结果有关联副作用,你的这些变量也许最后会有不同的值!(译注:可使用 {.noSideEffect.})为了安全只使用常量。
常量
常量是绑定一个值的符号。常量的值是不变的。编译器编译时会对声明为常量的表达式求值:
const x = "abc" # the constant x contains the string "abc"
关键字后缩进可以列出整个常量段:
const
x = 1
# a comment can occur here too
y = 2
z = y + 5 # computations are possible
let语句(未完待续)