Nim教程(I )

作者: 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语句(未完待续)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Fibonacci Nim是一个游戏,与Fibonacci数列有密切关系。根据引用\[1\]的描述,先手胜利的条件是硬币数量不是Fibonacci数。换句话说,必败态构成Fibonacci数列。如果硬币数量是Fibonacci数,那么后手必胜。这是因为先手只能在Fibonacci数列中的一堆中取硬币,而后手可以根据上一个问题的子问题的解决方案取走该堆最后一枚硬币,从而剩下的一堆硬币也可以如此拆分,使得先手必败。如果硬币数量不是Fibonacci数,根据Zeckendorf定理,可以将硬币数量表示为不连续的Fibonacci数之和。在这种情况下,先手可以先取完最小的一堆硬币,而后手无法取完剩下的最少的一堆硬币,从而面对必败态。因此,先手可以在每一堆中取到最后一枚硬币,从而获胜。\[2\]根据引用\[3\]中的代码,可以通过判断硬币数量是否是Fibonacci数来确定先手或后手的胜利。如果硬币数量是Fibonacci数,输出"Second win";如果不是,输出"First win"。 #### 引用[.reference_title] - *1* *3* [斐波那契博弈](https://blog.csdn.net/iteye_6233/article/details/82396581)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Fibonacci Nim(斐波那契尼姆)游戏](https://blog.csdn.net/darren0424/article/details/101639021)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值