空灵KONGLING

把中文,写成程序。

从第一句「说」到模块、文件和 JSON。每一章都配上写法、解释与示例,遇到问题也能按章节查回来。

空灵 3 语法手册 · 更新于 2026-09-15

第一段空灵程序

空灵使用中文表达常见的编程操作。程序保存在 UTF-8 编码的 .灵 文件中,从上到下执行。先跟着小林写一个能运行的小程序,再逐步添加判断和循环。

你好.灵
语言 空灵 3
全局 名字是“小林”
说“你好,” + 名字
说“欢迎来到空灵。”
预期输出
你好,小林
欢迎来到空灵。
  • 「语言 空灵 3」明确选择本手册使用的自然中文语法。
  • 「全局 名字是“小林”」创建一个保存文本的变量。
  • 「说」输出内容并换行;文本之间用 + 连接。
  • 把代码保存为「你好.灵」,在 IDE 中打开并运行。网页上的代码块不会自动执行程序。
回到文档开头

保存、编译与运行

初次使用建议从 IDE 运行代码。Windows 下载的是完整 ZIP 套件:解压到简短英文目录,再双击 Kongling.cmd。Java、编译器、标准库和 MinGW 一起提供,不要只复制其中一个 exe。

命令行中的 kl 是编译器。只有把它所在目录加入 PATH 后,才能直接使用短命令;否则需要写完整路径。下面的相对路径以终端当前工作目录为起点。

终端命令
kl --version
kl c 你好.灵
kl c -r 你好.灵
kl --version
查看编译器版本。
kl c 文件.灵
编译源文件,生成当前目标平台的可执行程序。
kl c -r 文件.灵
编译成功后立即运行。
kl c --out:程序 文件.灵
指定输出文件;Windows 通常使用 .exe 扩展名。

Windows PowerShell 中,带空格的路径要加引号,调用完整路径的程序时使用 &。下面示例假设终端已经进入解压后的套件根目录。

Windows PowerShell
& '.\platform\buildSNAPSHOT\compile\kl\bin\kl.exe' c -r '.\你好.灵'
回到文档开头

标点、注释与代码块

推荐每行写一个语句,用一致的缩进表示层次。方法、条件和循环等结构使用「结束」收尾;示例统一使用两个空格缩进,不要把 Tab 与空格混在一起。

书写规则.灵
语言 空灵 3
注:这一行是说明,不会执行。
# 这一行也是注释。
全局 分数是88
要 分数 大于等于 60 就
  说“通过”
结束
预期输出
通过
中文引号 “内容” / 英文引号 "内容"
用于文本。不要把变量名称放进引号。
(甲,乙) / (甲, 乙)
用于方法调用与参数。
【1,2】 / [1, 2]
用于列表和下标。
: / :
用于类型标注、方法头和记录字段。
注:内容 / # 内容
用于注释。代码中的说明不会变成程序输出。

字符串中的标点和关键字属于文字内容,不会被当作语法。英文双引号字符串内部可以使用 \" 表示引号、\n 表示换行。

文本转义.灵
说 "小林说:\"你好\""
说 "第一行\n第二行"
预期输出
小林说:"你好"
第一行
第二行
回到文档开头

变量与固定值

变量保存会变化的数据,固定值保存声明后不再赋值的数据。名称可以使用中文;取名应表达用途,例如「成绩」「总和」「是否通过」,避免用数字开头或直接使用语法关键字。

变量.灵
全局 名字是“小林”
全局 成绩是80
固定 及格线是60
成绩改为88
说 名字 + “的成绩:” + 成绩
必须 成绩 大于等于 及格线
预期输出
小林的成绩:88
全局 名称是值
明确声明变量。跨模块共享还需要「公开」,并非所有模块自动可见。
固定 名称是值
声明固定绑定;之后不能用「改为」或「听」修改。
局部 名称是值
在方法或当前局部结构内声明变量。
名称改为新值
修改已经声明的可变对象;未声明、固定或类型不匹配会报错。
名称是值
简写形式:可用于声明,也可修改已存在的可变对象。较长程序推荐明确写「全局 / 局部」和「改为」。
回到文档开头

类型与类型标注

空灵会根据值推断类型,也允许用「名称:类型是值」明确声明。类型标注尤其适合空列表、模块接口和复杂记录,能更早发现数据不一致。

类型.灵
全局 年龄:整数是21
全局 单价:浮点是3.5
全局 姓名:文本是“小林”
全局 已通过:真假是真
全局 分数们:整数列表是[88,92]
全局 待登记:文本列表是[]
说 姓名 + “,年龄:” + 年龄
说 “记录数量:” + 列表长度(分数们)
预期输出
小林,年龄:21
记录数量:2
整数
普通整数,位宽依目标平台而定。
浮点(兼容名称:小数)
用于小数运算,例如 3.5。
文本
保存字符串。
真假(兼容名称:布尔)
只表示「真」或「假」,不是任意数字。
整数列表 / 文本列表 / 列表(类型)
元素类型一致的可变长度列表。
JSON / 记录名称 / 数据表(键类型,值类型)
结构化数据类型,见后续章节。
可空类型
值可能不存在,需要先检查再取值。
回到文档开头

输出、输入与文本拼接

「说」输出一个表达式并换行。文本与数字拼接时可以使用 +;它与纯数字相加的含义不同。括号可以明确先计算数字再拼接。

输出.灵
全局 数量是3
说 “小林买了” + 数量 + “本书”
说 “合计:” + (2 + 3)
说 “已完成:” + 真
预期输出
小林买了3本书
合计:5
已完成:真

「听 名称」从标准输入读取一行文本。目标必须是可以修改的文本或可空文本,不能直接把输入读进整数变量。需要数字时,再显式转换。

输入.灵
全局 输入内容:文本是“”
听 输入内容
说 “你好,” + 输入内容
预期输出
你好,小林
回到文档开头

数字、运算与转换

常用算术运算符是 +、-、*、/ 和 %。「余数」是 % 的自然中文写法。使用括号表达希望先算的部分,避免仅靠读文字猜优先级。

算术.灵
全局 单价是12
全局 数量是3
说 单价 * 数量
说 (10 + 2) * 3
说 10 % 3
说 10 余数 3
说 5 / 2
预期输出
36
36
1
1
2.5

数字字面量可以使用十进制、0x 前缀的十六进制、0b 前缀的二进制、0o 前缀的八进制。代码中的进制字面量与「文本转整数」是两件事。

进制.灵
全局 十六进制是0x10
全局 二进制是0b1010
全局 八进制是0o10
说 十六进制
说 二进制
说 八进制
预期输出
16
10
8
转换.灵
全局 数量是文本转整数(“ 12 ”)
全局 单价是文本转浮点(“3.5”)
说 “数量:” + 数量
说 “单价:” + 单价
说 转为文本(真)
预期输出
数量:12
单价:3.5
真

整数变量与浮点变量不能直接混算。需要小数计算时,让参与运算的变量使用一致的浮点类型;不要假定编译器会自动把整数变量转成浮点数。

文本转整数(文本)
读取完整十进制整数,忽略首尾空白;空文本、杂字和超范围值会报错。
文本转浮点(文本)
读取完整浮点数;拒绝空内容、尾随杂字以及 NaN、Inf 等非有限值。
转为文本(值)
把支持的数字或真假值转为文本;真假值转为「真 / 假」。
转为整数 / 转为字节 / 转为16位整数…
用于相应整数类型之间的显式转换,检查目标范围。不要把它们当成任意浮点数取整接口。
回到文档开头

比较与逻辑

比较产生真假值。条件必须能判断为真假,不能把一个普通数字当作条件。多个条件使用「并且」「或者」连接,「非」表示取反。

相等 / 等于 / ==
两个值相等。
不相等 / 不等于 / !=
两个值不同。
大于 / >;小于 / <
严格比较大小。
大于等于 / 不小于 / >=
左边不低于右边。
小于等于 / 不大于 / <=
左边不高于右边。
并且 / 而且;或者;非
逻辑与、逻辑或、逻辑非。
比较.灵
全局 成绩是88
全局 已缺考是假
要 (成绩 不小于 60) 并且 (成绩 不大于 100) 并且 非(已缺考) 就
  说“成绩有效且及格”
结束
预期输出
成绩有效且及格

「并且」在左侧为假时不再求右侧;「或者」在左侧为真时不再求右侧。安全读取可空值时可以利用这个规则,但复杂表达式建议先拆成变量和分支。

回到文档开头

条件分支

「要 条件 就」开始一个分支;「否则要」继续判断下一个条件;「否则」处理所有前面条件都不成立的情况。整个分支链最后写一个「结束」。

成绩判断.灵
全局 成绩是88
要 成绩 大于等于 90 就
  说“优秀”
否则要 成绩 大于等于 60 就
  说“及格”
否则
  说“继续努力”
结束
预期输出
及格

同一条链只执行第一个成立的分支。把 ≥90 放在 ≥60 前面,否则高分会提前落入及格分支。只有一句输出时可以使用行内写法。

行内条件.灵
全局 成绩是100
要 成绩 大于等于 100,就说“满分”
预期输出
满分
回到文档开头

循环与提前结束

空灵提供范围遍历、列表遍历、固定次数重复和条件循环。范围循环的「从 起点 到 终点」包含两端;以下示例依次处理 1、2、3。

求和.灵
全局 总和是0
每个 当前值 从 1 到 3,做
  总和改为总和 + 当前值
结束
说 总和
预期输出
6
遍历列表.灵
全局 水果们是[“苹果”,“香蕉”,“橙子”]
每个 水果 在 水果们 里,做
  说 水果
结束
预期输出
苹果
香蕉
橙子
重复与条件循环.灵
重复 2 次,做
  说“开始练习”
结束
全局 计数是0
当 计数 小于 3 时
  说 计数
  计数改为计数 + 1
结束
预期输出
开始练习
开始练习
0
1
2
跳过与退出.灵
每个 数字 从 1 到 6,做
  要 数字 相等 3 就
    继续
  结束
  要 数字 相等 5 就
    跳出
  结束
  说 数字
结束
预期输出
1
2
4
继续
跳过本次剩余语句,进入下一轮。
跳出
退出当前循环。旧写法「中断」仍有兼容处理,新代码推荐「跳出」。
当 条件 时
每一轮执行前检查条件;循环体必须让条件有机会变为假,或主动跳出。
回到文档开头

方法、参数与返回值

方法把一段操作命名,方便多次调用。自定义方法名必须以「法」结尾,例如「相加法」。方法头由名称、参数括号和冒号组成,方法体最后使用「结束」。调用时必须写括号,没有参数也写空括号;内置操作使用文档列出的固定名称。

方法.灵
相加法(甲:整数,乙:整数)返回整数:
  返回 甲 + 乙
结束
全局 结果是相加法(3,5)
说 结果
预期输出
8
只执行操作.灵
问候法(名字:文本):
  说“你好,” + 名字
结束
问候法(“小林”)
预期输出
你好,小林

「返回」立刻结束当前方法,并把值交给调用方。有结果的方法要让所有正常执行路径都返回兼容类型的值。省略参数或返回类型时可以进行推断,但模块对外接口推荐写全。

多个返回分支.灵
评价法(成绩:整数)返回文本:
  要 成绩 大于等于 60 就
    返回“及格”
  否则
    返回“继续努力”
  结束
结束
说 评价法(88)
预期输出
及格
回到文档开头

作用域与命名

作用域决定一个名称在哪里可见。方法参数和「局部」变量用于当前方法;内部声明可以遮蔽外层同名变量。离开作用域后,不应再访问里面的局部名称。

局部变量.灵
全局 名字是“小林”
展示法():
  局部 名字是“访客”
  说 名字
结束
展示法()
说 名字
预期输出
访客
小林
  • 同名变量容易误读;除非确实需要遮蔽,优先给局部数据更具体的名称。
  • 「固定」限制重新赋值,不等同于把对象及其全部引用永久冻结;引用记录的共享语义见后文。
  • 「公开」解决模块边界的可见性,不代替参数、返回值或类型定义。
回到文档开头

列表与下标

列表保存一组同类型的数据。第一个元素的下标是 0,最后一个是长度减 1。读取或修改前,确保下标没有越界。

列表操作.灵
全局 数字们:整数列表是[10,20]
添加到列表(数字们,30)
数字们[0]改为15
移除列表项(数字们,1)
说 列表长度(数字们)
每个 数字 在 数字们 里,做
  说 数字
结束
预期输出
2
15
30
列表长度(列表)
返回元素个数。
添加到列表(列表,元素)
在末尾加入一个类型兼容的元素;修改原列表。
移除列表项(列表,下标)
删除指定位置,其后元素向前移动;下标必须有效。
列表[下标] / 列表【下标】
读取指定元素,也可以作为「改为」的目标。
回到文档开头

文本处理

文本不仅可以拼接,还可以检查、整理、替换和拆分。拆分结果是文本列表,连接操作把文本列表重新组合为一个文本。

文本操作.灵
全局 原文是“  小林,小禾  ”
全局 整理后是去掉首尾空白(原文)
全局 名字们是拆分文本(整理后,“,”)
说 连接文本(名字们,“ / ”)
说 替换文本(整理后,“小禾”,“小雨”)
要 文本包含(原文,“小林”) 就
  说“找到了”
结束
预期输出
小林 / 小禾
小林,小雨
找到了
中文长度.灵
说 文本长度(“你好😊”)
预期输出
3
文本长度(文本)
计算 Unicode 码点数;例如「你好😊」是 3。组合字符、家庭 emoji 等显示成一个图形时可能包含多个码点。
文本包含(原文,片段)
检查是否含有指定片段,返回真假。
去掉首尾空白(文本)
移除首尾空白,保留中间内容。
替换文本(原文,旧片段,新片段)
返回替换后的文本。
拆分文本(原文,分隔文本)
按指定分隔文本拆为文本列表。
连接文本(文本列表,分隔文本)
把元素按分隔文本拼接。
回到文档开头

记录与自定义类型

记录把一组有名称的字段放在一起,例如一个人的姓名和年龄。直接用大括号可以创建匿名记录;需要在方法、列表或模块间复用时,先声明命名记录类型。

匿名记录.灵
全局 用户是{
  姓名:“小林”
  年龄:21
}
用户.年龄改为22
说 用户.姓名 + “,年龄:” + 用户.年龄
预期输出
小林,年龄:22
命名记录.灵
记录 用户资料:
  姓名:文本
  年龄:整数
  标签们:文本列表
结束
全局 用户:用户资料是{
  姓名:“小林”
  年龄:21
  标签们:[“学生”,“开发者”]
}
说 用户.姓名
说 列表长度(用户.标签们)
预期输出
小林
2
回到文档开头

可空值与安全取值

「没有」表示值不存在,不是空文本、数字 0 或「假」。把类型写成「可空文本」「可空整数」等,才能接收不存在的情况。

可空值.灵
全局 昵称:可空文本是没有
昵称改为“小林”
要 有值(昵称) 就
  说 取值(昵称)
否则
  说“访客”
结束
预期输出
小林
有值(可空变量)
检查当前是否保存着值。
取值(可空变量)
提取内部值;先在可证明有值的路径中检查。
可空整数列表
整个整数列表可不存在。
列表(可空整数)
列表存在,但每个元素可以是整数或「没有」。
含可空元素的列表.灵
全局 昵称们:列表(可空文本)是[“小林”,没有]
每个 昵称 在 昵称们 里,做
  要 有值(昵称) 就
    说 取值(昵称)
  否则
    说“未填写”
  结束
结束
预期输出
小林
未填写
回到文档开头

数据表与有序数据表

数据表根据键保存和查找值。例如「数据表(文本,整数)」可以用姓名查成绩。创建空表需要明确键和值的类型。

查成绩.灵
全局 成绩表:数据表(文本,整数)是空表
成绩表[“小林”]改为95
成绩表[“小禾”]改为88
全局 查找结果是按键查找(成绩表,“小林”)
要 有值(查找结果) 就
  说 取值(查找结果)
结束
预期输出
95
表[键]改为值
写入或更新指定键。键和值必须符合类型。
有键(表,键)
检查键是否存在。
按键查找(表,键)
安全读取,返回可空值;缺键时得到「没有」。
所有键(表) / 所有值(表)
分别遍历键或值。需要键值对应关系时,可遍历键再按键查找,如下例。
按登记顺序遍历.灵
全局 成绩表:有序数据表(文本,整数)是{
  “小林”:95
  “小禾”:88
}
每个 名字 在 所有键(成绩表)里,做
  局部 分数是按键查找(成绩表,名字)
  要 有值(分数) 就
    说 名字 + “:” + 取值(分数)
  结束
结束
预期输出
小林:95
小禾:88
回到文档开头

引用记录

普通记录适合描述数据值。引用记录保存对象引用,多个变量可能指向同一个对象,修改它时要留意共享影响。它也可以表达链表这类相互引用的结构。

引用记录.灵
引用记录 节点:
  值:整数
  下一个:可空节点
结束
全局 尾节点:节点是{
  值:2
  下一个:没有
}
全局 头节点:节点是{
  值:1
  下一个:尾节点
}
要 有值(头节点.下一个) 就
  说 取值(头节点.下一个).值
结束
预期输出
2
回到文档开头

多文件模块与公开声明

程序变大后,可以把相关方法放进独立的 .灵 文件。使用「导入 模块名」引用同目录模块。只有明确公开的声明才作为模块接口提供给外部代码。

计算工具.灵
公开 固定 模块名称是“计算工具”
公开 相加法(甲:整数,乙:整数)返回整数:
  返回 甲 + 乙
结束
主程序.灵
导入 计算工具
说 模块名称
说 相加法(3,5)
预期输出
计算工具
8
  • 把这两个示例分别保存为同目录下的「计算工具.灵」和「主程序.灵」,然后运行主程序。
  • 可以公开方法、记录类型、全局变量和固定值。公开变量必须明确写「公开 全局」或「公开 固定」。
  • 公开声明放在模块最外层,不要把普通执行语句或方法内部的局部变量标成公开。
  • 跨模块重复的公开名称可能产生歧义。优先规划清楚模块职责与接口名称。
回到文档开头

错误处理与资源清理

输入格式不正确、读取文件失败等属于需要处理的运行问题。「尝试」执行可能出错的操作,「遇到错误 原因」读取错误消息,「无论如何」用于无论成功或失败都要执行的清理。

错误处理.灵
尝试
  报错“分数格式不正确”
遇到错误 原因
  说“已经处理:” + 原因
无论如何
  说“结束本次检查”
结束
预期输出
已经处理:分数格式不正确
结束本次检查

「报错 文本」主动抛出可捕获的错误。「最后执行」登记当前作用域退出时执行的操作,适合方法中的清理工作。

退出时清理.灵
处理法():
  最后执行 说“清理完成”
  说“正在处理”
结束
处理法()
预期输出
正在处理
清理完成
回到文档开头

必须满足的条件

「必须 条件」声明一条不允许违反的要求;可以用「否则说」补充错误原因。它适合检查程序不变量,不适合代替所有可恢复的输入校验。

检查结果.灵
全局 总和是0
每个 数字 从 1 到 3,做
  总和改为总和 + 数字
结束
必须 总和 相等 6,否则说“求和结果不正确”
说“检查通过”
预期输出
检查通过
回到文档开头

文本文件与二进制文件

文件操作使用文本路径。先创建父目录,再写入文件。写入会覆盖同名文件,示例使用单独的演示目录;复制到自己的项目时先确认路径。

文本文件.灵
固定 目录是“文档演示”
固定 路径是“文档演示/问候.txt”
创建文件夹(目录)
写入文本文件(路径,“你好,小林”)
要 文件是否存在(路径) 就
  说 读取文本文件(路径)
结束
预期输出
你好,小林
二进制文件.灵
全局 数据:字节列表是[0,127,255]
写入二进制文件(“演示数据.bin”,数据)
全局 读回是读取二进制文件(“演示数据.bin”)
说 列表长度(读回)
预期输出
3
读取文本文件(路径)
读取完整文本内容;失败时应捕获错误。
写入文本文件(路径,内容)
写入文本内容,覆盖已有文件。
读取二进制文件(路径)
返回字节列表,不经过文本编码转换。
写入二进制文件(路径,字节列表)
写入原始字节,普通整数列表不能直接当字节列表。
文件是否存在(路径)
检查文件是否存在,不保证稍后的读取一定成功。
创建文件夹(路径)
创建目标目录。
回到文档开头

JSON 与安全访问

JSON 用于交换结构化数据。「解析JSON」把文本变成 JSON 值;按键或位置查找,以及转换到文本、整数等类型,都可能失败,所以返回可空值。

读取 JSON.灵
固定 原文是“{\"name\":\"小林\",\"age\":21}”
全局 根值:JSON是解析JSON(原文)
全局 名称节点是JSON按键查找(根值,“name”)
要 有值(名称节点) 就
  局部 名称是JSON转文本(取值(名称节点))
  要 有值(名称) 就
    说 取值(名称)
  结束
结束
说 JSON类型(根值)
预期输出
小林
对象
解析JSON(文本)
解析 JSON,格式不合法时抛出错误。
生成JSON文本(JSON值)
把 JSON 值序列化为文本。
读取JSON文件(路径) / 写入JSON文件(路径,JSON值)
读取或覆盖写入 JSON 文件。
JSON按键查找(JSON值,文本键)
读取对象字段,返回可空JSON。
JSON按位置查找(JSON值,整数位置)
读取数组元素,下标从 0 开始,返回可空JSON。
JSON转文本 / JSON转整数 / JSON转浮点 / JSON转真假
尝试转换到对应类型,返回可空结果。
JSON类型(JSON值)
返回类型名称,例如「对象」。
回到文档开头

获取网络文本

「获取网络文本(地址)」发送 HTTP/HTTPS GET 请求并返回响应正文。网络请求可能超时或返回错误状态,应放在错误处理结构中。

网络请求示例
尝试
  局部 内容是获取网络文本(“https://example.com”)
  说 内容
遇到错误 原因
  说“请求失败:” + 原因
结束

环境相关示例:仅验证编译,不自动联网或执行平台操作。

当前内置策略为 15 秒无数据超时、最多 5 次重定向和 4 MiB 正文上限。只接受 HTTP 或 HTTPS 地址;非 2xx 响应按错误处理。示例需要联网,输出取决于远端服务,不给出固定运行结果。

回到文档开头

定宽整数与位运算

二进制协议和硬件数据需要明确位宽。空灵提供 8、16、32、64 位有符号与无符号整数;「字节」是 8 位无符号整数,取值为 0 到 255。也支持 32位浮点、64位浮点。

字节运算.灵
全局 状态:字节是0b1010
全局 低位:字节是状态 位与 0b0011
全局 宽值:16位无符号整数是转为16位无符号整数(状态)
说 低位
说 宽值
预期输出
2
10
8位整数 / 16位整数 / 32位整数 / 64位整数
有符号整数。
8位无符号整数 / 16位无符号整数 / 32位无符号整数 / 64位无符号整数
非负定宽整数。
位与 / &;位或 / |;位异或 / ^
按二进制位计算。
左移 / <<;右移 / >>;位取反 / ~
移动或翻转二进制位。
回到文档开头

针对目标平台编译

「针对 … 系统编译」和「针对 … 架构编译」决定哪些代码参与编译。它与运行时的「要」不同:选择依据是编译目标,而不是用户运行时输入的条件。

平台分支.灵
全局 平台名称:文本是“未知”
针对 Windows 系统编译:
  平台名称改为“Windows”
否则针对 macOS 系统编译:
  平台名称改为“macOS”
否则
  平台名称改为“其他”
结束
说 平台名称

环境相关示例:仅验证编译,不自动联网或执行平台操作。

架构条件可使用已支持的名称,例如 x64、x86、ARM64。写出条件不等于已经准备好交叉编译环境;生成其他平台程序仍需要相应的编译器、链接器和平台资源。

回到文档开头

桌面扩展与适用范围

仓库提供 kongling3desktop 扩展与桌面示例,用于对话框等桌面能力。它不是本手册基础语法的必需导入;调用这些能力需要确认当前操作系统与发行包支持。

基础语法中的「说」「听」操作终端输入输出,不会自动创建图形窗口。IDE 的流程图、编辑提示和项目栏也属于开发工具功能,不是语言语句。

  • 先在终端示例里确认逻辑和数据类型,再接入桌面交互。
  • 不要把某个平台上的示例运行成功,推断为所有 Windows、macOS 和移动平台都可用。
  • 本页覆盖自然中文表层语法及已核对的常用接口,不是全部底层标准库、后端或 GUI 框架的 API 手册。
回到文档开头

完整示例:小林的成绩单

这个例子把类型、方法、列表、循环、条件和检查串在一起。先运行原版,再修改成绩列表,观察平均分和评价如何变化。

小林的成绩单.灵
语言 空灵 3
评价法(成绩:整数)返回文本:
  要 成绩 大于等于 90 就
    返回“优秀”
  否则要 成绩 大于等于 60 就
    返回“及格”
  否则
    返回“继续努力”
  结束
结束

固定 姓名是“小林”
全局 成绩们:整数列表是[88,92,75]
全局 总分是0
必须 列表长度(成绩们) 大于 0,否则说“请先录入成绩”
每个 成绩 在 成绩们 里,做
  必须 成绩 不小于 0 并且 成绩 不大于 100
  总分改为总分 + 成绩
  说 转为文本(成绩) + “:” + 评价法(成绩)
结束
说 姓名 + “的总分:” + 总分
说 “平均分:” + (总分 / 列表长度(成绩们))
预期输出
88:及格
92:优秀
75:及格
小林的总分:255
平均分:85.0
  • 把姓名改成另一个名字,观察文本输出。
  • 给列表再加入一个成绩,检查总分是否随之变化。
  • 把某个成绩改为 101,观察「必须」如何报告不合法数据。
  • 把成绩列表改为空,观察为什么需要在除法之前检查长度。
回到文档开头

常见错误与排查顺序

优先处理编译器报告的第一个错误。后面的报错可能只是前面结构未闭合造成的连锁结果。核对文件、行号和列号后,先缩小到最短能复现问题的代码。

找不到名称或方法
检查拼写、作用域、参数个数,以及模块是否导入、声明是否公开。
原来是整数,不能改成文本
保持变量类型一致,或另建变量;需要转换时使用明确的转换方法。
已经固定,不能修改
需要修改的数据使用变量;固定值、固定列表不要作为输入或变更目标。
缺少结束 / 否则前面没有对应条件
检查结构配对和缩进,尤其是方法内嵌套的条件、循环。
可能是「没有」
保存可空结果,先「有值」再「取值」;发生修改后重新检查。
索引越界
确认列表不是空的,下标从 0 开始,且小于列表长度。
输入内容无法转成数字
「听」得到文本,先去掉首尾空白或使用转换接口,并处理格式错误。
无法读取文件
检查程序工作目录、路径、文件权限以及文件是否被其他程序移动。
编译器命令不存在
使用正确的完整 kl.exe 路径,或在已经配置好的 IDE 内运行。
示例在旧包中无法识别
确认当前使用空灵 3,核对下载版本;不要混用不同版本的编译器、标准库和配置。
回到文档开头

关键词速查

语言 空灵 3
选择自然中文语法。
全局 / 局部 / 固定 / 改为
声明与赋值。
说 / 听
终端输出与输入。
要 / 就 / 否则要 / 否则 / 结束
条件分支与结构收尾。
每个 / 从 / 到 / 在 / 里 / 做
范围与集合遍历。
重复 / 次 / 当 / 时 / 继续 / 跳出
次数循环、条件循环与循环控制。
返回 / 待实现
方法返回与占位。
记录 / 引用记录
结构化类型。
没有 / 可空… / 有值 / 取值
可空值与安全读取。
数据表 / 有序数据表 / 空表
键值集合。
导入 / 公开
模块与可见性。
尝试 / 遇到错误 / 无论如何 / 报错 / 最后执行
可恢复错误与清理。
必须 / 否则说
必须满足的条件。
针对 / 系统编译 / 架构编译 / 否则针对
编译目标条件。

没有找到需要的能力时,先搜索操作名称,也可以回到相关数据类型章节。本手册中的可运行示例会参与文档测试;网络、平台分支等有环境依赖的示例会明确区分验证方式。

回到文档开头