洛书编程语言是一门可以同时使用中文关键字和英文关键字的解释型编程语言。本文仅讨论它的安装和使用,其余不赘述。
本文默认您已拥有使用其他编程语言的经验,即至少知道变量、函数、类等概念。完全面向初学者的教程尚在酝酿。
本文基调为中文语言环境,对应的英文风格可以通过查阅官方文档掌握。
本文初发时最新的洛书只有1.6.5,现已逐步更新到1.7.0的教程。
目录
网址
官网地址
官网地址为
仓库地址为
洛书编程语言: 一款超轻量、高性能、跨平台的嵌入式脚本语言,可以运行在Windows、Linux、MCU上。致力于打造一款开源、高效、强大的编程语言
文档
语法教程:
https://losu.tech/wiki/%E8%AF%AD%E6%B3%95%E6%89%8B%E5%86%8C/1-%E5%89%8D%E8%A8%80.md
文档中心
https://losu.tech/wiki/readme.md
下载
首先,在上文中打开官网:
看到顶栏的下载,点击跳转
然后就可以根据自己的计算机环境安装了。Windows用户安装后将zip文件解压到自己想放置洛书的文件夹,之后点击install.bat,这个脚步会自动帮你配置环境变量等。
lpt的使用
详见我的另一篇博文:
打印“你好,洛书!”
按编程界的惯例,我应当推荐打印“Hello world”。但在洛书中可以尝试不一样的选择。
对应Python中的print,洛书也内置了一个输出函数,名为“打印”。所以我们可以在洛书解释器中输入以下代码:
打印("你好,洛书")
运行结果如下:
注意,有些标点符号要使用英文标点,详见注意1。
内置数据类型
数据类型 | 英文名称 | 字面量书写示例 | 内置转化方法名 |
数字 | double | 1024.0 | 数值化 |
字符串 | str | "洛书编程语言" | 字符化 |
单元 | unit | {} | |
空 | null | 空 |
洛书中并没有bool这种类型。洛书的设计哲学是:“有值为真,无值为假”。即null相当于bool中的False,其余一切数据类型,不管值如何,都为假。
关于数字
数字的实质是C中的double型数据,在数学上的含义为实数。数字总是有符号的。
并且,洛书的数字的取值范围为-2^1024 ~ +2^1024。其中^表示乘方。
关于字符串
洛书字符串实质就是C中的char*。但是洛书进行了高层次的封装,使字符串更易用。
字符串的书写和Python类似,可以使用单引号或双引号括起。单双括号可以嵌套。如
甲 = "洛书编程语言"
乙 = '洛书编程语言'
丙 = "'洛书编程语言'"
打印(甲)
打印(乙)
打印(丙)
甲和乙对应的输出都是洛书编程语言,丙对应的输出为'洛书编程语言'。
关于单元
单元是一种离散型的数据结构。有点类似于Python的dict。单元在洛书中被用来构造数组、类等。
构造数组
使用单元构造数组的方式和在C/C++中的类似。即将元素放在花括号中,各个元素之间用逗号运算符分割。洛书是一种弱类型的编程语言,放在单元中的数据不一定是同一种类型。如
令 甲 = {33, "洛书编程语言", 3.9, {}}
凡是洛书中的数据结构,都可以放入单元中。
在这种构造方法下,可以使用索引的方式访问单元中的元素。注意,与大多数编程语言不同,洛书中第一个元素的索引为1。下面给出访问甲中第一个元素的示例
令 甲 = {33, "洛书编程语言", 3.9, {}}
打印(甲[1])
输出为33。若要访问其他元素,如第3个元素是3.9,将方括号中的索引改为3即可。
构造对象
可以通过赋值运算或方括号运算符初始化一个对象。如
令 甲 = {
名称 = "洛书编程语言",
["开发者"] = 陈朝臣
}
无论是赋值运算还是方括号运算都会向单元中添加一个属性,可以通过通过点访问运算符或方括号运算符访问。如
令 甲 = {
名称 = "洛书编程语言",
["开发者"] = '陈朝臣'
}
打印(甲.名称)
打印(甲["名称"])
打印(甲.开发者)
打印(甲["开发者"])
输出为
洛书编程语言
洛书编程语言
陈朝臣
陈朝臣
可见,两种访问方式在结果上是等价的。
访问单元中的元素
单元同时支持点访问运算符和方括号运算符。
令 甲 = {
33, 45
}
甲.名称 = "洛书编程语言"
打印(甲[1])
打印(甲["名称"])
输出为
33
洛书编程语言
当访问了不存在的单元元素时,会返回null。
向单元添加方法
向单元添加方法的方式,和声明一个方法类似,只是方法名变成了单元的一个属性。如
令 甲 = {
名称 = "洛书编程语言"
}
方法 甲.查找(关键字):
回 此[关键字]
;
对于用声明形式添加的方法,洛书会隐式地向作用域中添加一个名为“此”的变量,该变量即该方法隶属的单元本身。这跟C++的设计类似。这样,可以方便地将方法和数据关联起来,即完成了算法和数据结构的交互。如
令 甲 = {
名称 = "洛书编程语言"
}
方法 甲.查找(关键字):
回 此[关键字]
;
打印(甲.查找("名称"))
输出为洛书编程语言
向单元添加方法是洛书面向对象编程的基础,洛书通过这种方式来构造类。详情参照本文中专讲类的部分。
注意,单元中的方法,在访问时第一个参数是this指针。如下面代码:
令 甲 = {}
方法 甲.方法1(参数1):
;
甲 = 方法(此, 参数1):
;
这两种添加方法的方式是等价的。实际上,在第一种构造方法中,洛书向参数列表最前面隐式地添加了一个“此”参数。
因为这个特性,不能把在全局作用域定义的方法直接放到单元中,这会导致它不能正常工作。
如下面代码
令 甲 = {}
方法 方法1(数字):
回 数字
;
甲.方法1 = 方法1
打印(甲.方法1(5))
此时,原本应该接受5这个数字字面量的参数位置,实际赋给的是甲这个单元本身。所以不会输出5。
单元使用的注意事项
数组风格的初始化方法和对象风格的初始化方法不能同时使用。如下面是一个错误例子
令 甲 = {
88,
名称 = "洛书编程语言"
}
但是初始化后,单元的使用就宽松很多。如
令 甲 = {
33, 5.9, "这是个单元"
}
甲.名称 = "洛书编程语言"
甲["编译器"] = "GCC"
关于强制类型转化
洛书中可以使用内置类型转化方法来进行强制类型转化,如将字符型值转化为整数型值。如
令 甲, 乙, 丙
甲 = "33"
乙 = "3"
丙 = 数值化(甲) + 数值化(乙)
打印(丙)
输出为36。因为洛书中字符串类型并没有+运算,所以上述代码将字符类型值转化为数值型值进行了运算。
关于类型查看
洛书中内置了“类型”方法用于查看值的类型。如
令 甲
甲 = 类型("洛书编程语言")
打印(甲)
输出为string
类型方法的返回值为字符类型。下面为各个类型在调用“类型”方法后的返回值表
数据类型 | 返回值 |
数字 | number |
字符串 | string |
单元 | unit |
空 | null |
变量声明
洛书是动态数据类型的编程语言,其变量不用声明数据类型。
声明变量的格式为
令 变量名 = 表达式
例如
令 人数 = 50
可以在声明变量时省略赋值,如
令 人数
可以同时对多个变量进行声明,变量名之间用逗号隔开,如
令 人数, 班别
令 甲, 乙 = 5
可以省略关键字令,此时声明的变量为全局变量。也就是说,用关键字令声明的变量为局部变量。在声明全局变量时,必须在声明的同时进行赋值。如
名称 = "洛书编程语言"
赋值语句
洛书中的赋值语句格式如下
标识符 = 表达式
标识符指代表一个对象的符号,包括变量名、函数名、类名等。如
令 甲, 乙
甲 = 8
乙 = 16 + 25
如果标识符未事先声明,该语言与全局变量的声明等同。如
甲 = 8
运算符
赋值运算符
运算符 | 含义 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
^ | 乘方 |
& | 字符串拼接 |
[] | 取值 |
在数学运算中,加减乘除等运算符的使用不用赘述,这里仅给出简单示例
令 甲, 乙, 丙
甲 = 8
乙 = 12
丙 = 甲 + 乙
字符串拼接示例如下
令 街道名, 门牌号, 详细地址
街道名 = "洛书街"
门牌号 = "33号"
详细地址 = 街道名 & 门牌号
打印(详细地址)
输出为:洛书街33号
取值运算符示例如下
令 甲
甲 = {}
甲.名称 = "河图"
打印(甲["名称"])
输出为:河图
逻辑运算符
运算符 | 含义 |
---|---|
> | 大于 |
< | 小于 |
== | 等于 |
<= | 小于等于 |
>= | 大于等于 |
!= | 不等于 |
! / 非 | 非 |
&& / 且/ and | 且 |
|| / 或 / or | 或 |
在洛书中,有值为真,无值为假。也就是说,逻辑运算符若运算结果为真,则返回非空值;反之返回空。一般逻辑运算为真时返回一个数值型值。
洛书中没有布尔值,这点需要熟悉。
控制语句
条件语句
基本语法
如果 条件1 : #这里面的内容在满足条件1的情况下会被执行 另外 条件2 : #这里面的内容在不满足条件1、满足条件二的情况下会被执行 否则 : #这里面的内容在不满足前面所有条件的情况下会被执行 ;
对于洛书来说,任何非空值,包括0,在如果语句中都判断为真。下面给出示例
令 甲, 乙
甲 = 0
乙 = 空
丙 = 5
如果 甲:
打印("甲为真")
否则:
打印("甲为假")
;
如果 乙:
打印("乙为真")
否则:
打印("乙为假")
;
如果 丙==1:
打印("丙等于1")
另外 丙==5:
打印("丙等于5")
否则:
打印("丙的值未知")
;
输出为
甲为真
乙为假
丙等于5
循环语句
当语句
基本语法
当 条件 : # 条件 成立时执行 ;
当语句会在每次运行语句块之前检查条件,若条件为真,则执行语句块;若条件为假,则退出循环。如
令 次数 = 1 当 次数 <= 5:
打印(次数)
次数 = 次数 + 1
;
输出为
1
2
3
4
5
重复语句
基本语法
重复 #执行直到条件成立 至 条件
会先执行语句块,之后再判断条件。若条件值为真,则结束循环;否则继续循环。重复语句的末尾不用加分号。如
令 次数 = 1 重复
打印(次数)
次数 = 次数 + 1
至 次数==5
输出为
1
2
3
4
计次语句
基本语法
计次 变量 = 初值,终值[,步幅=1] : #循环内操作,每次循环变量值加 步幅(默认唯一),直至终值 ;
计次语句初始化时声明的变量不能用关键字令,而且只存活于隶属的语句块内,之后对应的内存将被释放。循环中有 __极值__
与__步幅__
两个变量,分布指向初始化时的极值与步幅。如
计次 次数=0, 5:
打印(次数)
;
输出为
0
1
2
3
4
5
设置了步幅的示例:
计次 次数=0, 5, 2:
打印(次数)
;
输出为
0
2
4
列举语句
基本语法
列举 甲,乙 = {}: ;
类似于Python中的元组拆包。循环中有 __此__
变量,可以返回被列举的对象。如
令 甲 = {
名称 = "洛书编程语言",
开发者 = "陈朝臣"
}
列举 乙, 丙 = 甲:
打印(乙 & ":" & 丙)
;
输出为
名称:洛书编程语言
开发者:陈朝臣
流程控制语句
跳出语句
基本语法
某个循环
#此处为语句块
跳出
;
用于从循环语句中跳出,对非循环语句无效。例如
计次 次数 = 0, 100000000:
打印(次数)
如果 次数>=5:
跳出
;
;
输出为
0
1
2
3
4
5
方法(函数)
洛书中方法的有两种声明方式
1.普通声明
方法 方法名(参数列表):
#此处为语句块
回 返回值
;
在普通声明中,方法名不可省略。若无参数,则参数列表处可留空。方法计算关键字“回”之后的表达式并返回结果。方法以英文分号为结束标志。
如
方法 相加(甲, 乙):
回 甲 + 乙
;
2.赋值声明
变量名 = 方法(参数列表):
#此处为语句块
回 返回值
;
如
相加 = 方法(甲, 乙):
回 甲 + 乙
;
在示例中,相加是一个全局变量,而新声明的方法则被赋给了该变量。这种写法和普通声明是等同的。
注意
1.洛书中的括号 () 、双引号 "" 、冒号 : 、应该使用英文字符。可在输入法设置输入中文时使用英文字符。逗号不区分中英文。