0.学习导言
在学习Torch7深度神经网络学习库之前,我们首先来学习一些基本的Lua语言基础知识。Lua语言是一种轻量级的脚本语言,它是用标准C语言编写并以源代码形式开放,其设计的基本目的是为了嵌入应用程序中,从而为程序提供灵活的扩展和定制功能。
Lua语言具有以下基本的特性:
- 轻量级:它用标准C语言编写并以源代码的形式开放,编译之后仅仅一百余K,可以很方便的嵌入别的程序中。
- 可扩展性:Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C和C++)提供这些功能,Lua可以使用它们,就像本来就内置功能一样。
- 其他特性:
- 支持面向过程式编程和函数式编程;
- 自动内存管理机制:只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
- 语言内置模式匹配:闭包;函数也可以作为一个值;提供多线程支持;
- 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,例如数据抽象,虚函数,继承和重载等等。
1.Lua语法基础
1.1 基本语法
注释
单行注释以及多行注释
-- 这里表示单行注释的意思
-- [[
这里表示多行注释的意思
多行注释
-- ]]
标识符
- 标识符用于定义一个变量,函数获取其他用户定义的项。标识符以一个字母A到Z或者是a到z或者下划线开头加上0个或者多个字母,下划线或者数字
- 最好不要使用下划线加大写字母的标识符
- Lua不允许使用特殊字符@,$,和%来定义标识符,Lua是一个大小写区分的编程语言。
关键词
以下例举出了Lua的保留关键字,这些字符不能作为常量或者其他用户定义标识符:
and | break | do | else | elseif |
---|---|---|---|---|
end | false | for | function | if |
in | local | nil | not | or |
repeat | return | then | true | until |
while | goto |
一般约定,以下划线开头链接一串大写字母的名字(例如_VERSION)被用作保留用于Lua内部全局变量。
Chunks
Chunk 是一系列语句,Lua 执行的每一块语句,比如一个文件或者交互模式下的每
一行都是一个 Chunk。一个 Chunk 可以是一个语句,也可以是一系列语句的组合,还可以是函数,Chunk可以很大。
每个语句结尾的分号(;)是可选的,但如果同一行有多个语句最好用“;”分开。
变量
变量在使用之前,必须在代码中进行声明变量,即创建该变量。Lua语言中的变量由三种变量:全局变量、局部变量、表中的域
在默认情况下,变量总是认为是全局的。
全局变量不需要声明,给一个变量赋值之后即可以创建这个全局变量,访问一个没有初始化的全局变量会得到结果nil。
局部变量与全局变量不同,局部变量只在被声明的那个代码块内有效。代码块是指:一个控制结构内,一个函数体,或者是一个chunk(变量被声明的那个文件或者文本串)。应该尽可能的使用局部变量,它有两个好处:
- 避免命名冲突;
- 访问局部变量的速度要比全局变量更快。
例如以下语句表达了局部变量和全局变量之间的关系
x = 10
local i = 1 -- local to the chunk
while i<x do
local x = i*2 -- local to the chunk
print (x) -- 2,4,6,8,...
i = i + 1
end
if i > 20 then
local x -- local to the "then" body
x = 20
print(x + 2)
else
print(x) -- 10 (the global value)
end
print(x)
1.2 数据类型
Lua是一个动态类型的语言,变量不要定义类型,只需要为变量赋值即可。值可以存储在变量中,作为参数传递或者在结果中返回。
Lua中有8个基本类型,分别为:nil、boolean、number、string、userdata、function、thread和table。关于这几种数据类型的描述,可以由以下列表进行描述:
数据类型 | 描述 |
---|---|
nil | 这个类型只有nil值属于该类型中,表示一个无效值(在条件表达式中表示false) |
boolean | 包含有两个值:false和true |
number | 表示双精度类型的实浮点数 |
string | 字符串由一对双引号或者单引号来表示 |