01认识 SIMPLE
Simple(简称 SimpleLang)是一门前端与后端一体化的解释型语言,SIMPLE 是它的代码格式名。v3.88 是当前「网页端在线开发」版本,v0.01 为早期预览版。
SIMPLE 是什么
- 你在编辑区里写的代码,就是 SIMPLE 代码;它由引擎实时转译为 HTML 网页。
- SIMPLE 用「简单中文式指令 + 缩进」描述页面,读起来接近自然语言,无需会 HTML / CSS / JavaScript。
- 只需掌握 5 类语法:
it(声明变量)、in(分级展示)、if / orif / noif(判断)、to / fr(跳转)、表达式(四则运算、比较与逻辑)。 - 无需安装任何环境:打开网页端即可编写、预览、导出。
学习前提
- 会打开浏览器、会打字即可,不需要任何编程经验。
- 建议边看边动手,每章都下载
.hc练习文件导入后照着改。
推荐学习路径
- 先跑通「02 快速上手」里的第一个程序。
- 掌握「03 变量」和「04 展示」。
- 学会「05 条件判断」做分支。
- 学会「07 页面跳转」做多页应用。
- 用「11 完整案例」把所学串起来。
- 遇到问题查「13 常见问题」和「12 速查表」。
- 下载本章
.hc导入,观察三段文案的显示效果。 - 把「标题」「简介」「说明」的文字改成你自己的话。
- 新增一行
it 新变量 t ...和对应的新变量 in t,观察变化。
02快速上手:第一个程序
3 分钟跑通一个「你好,Simple」页面,建立整体印象。
操作步骤
- 打开官网,点「网页端体验」进入在线开发环境。
- 点「新建项目」,输入项目名,例如「我的第一个项目」。
- 项目会自动带一个默认页面「页面1」,点击它进入编辑区。
- 在代码编辑区输入:
it 标题 t 你好,Simple
标题 in t
- 点右上角「✓ 实时转译」,或切到「转译预览」标签,即可看到「你好,Simple」放大居中显示。
- 代码会自动保存到本地浏览器,下次打开可点「恢复最近项目」继续。
逐行解释
it 标题 t 你好,Simple:声明一个名为「标题」的文字变量,值为「你好,Simple」。标题 in t:把「标题」这个变量以文字(t)方式居中显示出来。- 你不需要写
<html>、<head>、<body>等标签,页面骨架由引擎自动生成。
- 新建项目手动输入上面两行,验证与下载文件效果一致。
- 把「你好,Simple」改成「你好,世界」,实时预览。
03变量 it
用 it 声明变量。变量用于存放文字、图片或普通数据,供下文的 in 展示和 if 判断使用。
三种变量
- 普通变量 —— 语法
it 名字 [类型] [值]- 例:
it 备注(只声明,无值) - 例:
it 年龄 int 18(带类型标注的值) - v3.88 中
int / str / float / bool / list / dict / tuple这些类型标注,目前统一按「普通变量」处理,不做强类型校验,仅作语义提示。 - 普通变量不会直接显示在页面上,主要供条件判断使用。
- 例:
- 文字变量 —— 语法
it 名字 t 值t表示 text,值是一段文本。- 例:
it 标题 t 你好,Simple - 配合
名字 in t显示。
- 图片变量 —— 语法
it 名字 pp表示 picture,声明后不含文字值。- 真实图片需到「变量」面板上传绑定。
- 配合
名字 in p显示。
命名规则
- 可以以字母、下划线或中文开头(
A-Z、a-z、_、中日韩汉字)。 - 后面可跟字母、数字、下划线、中文。
- 示例:
标题、title、用户年龄、分数都是合法变量名。 - 同一页面内变量名不要重复。
文字值里可以包含空格和中文,直接写在 t 后面即可,无需加引号。一行只能声明一个变量。
变量声明本身不会在页面上显示,必须用 in 才会真正展示出来。
- 声明三种变量(普通 / 文字 t / 图片 p)。
- 分别用
in t、in p展示。 - 给普通变量加类型(如
int),观察它始终按普通变量处理。
04展示 in
用 in 把已声明的变量渲染到页面上。v3.88 新增五种展示样式,让排版更有层次。
五种展示样式
| 写法 | 等价 | 样式 | 用途 |
|---|---|---|---|
变量名 in t | text | 大标题 | 页面主标题,居中放大加粗 |
变量名 in s | sub | 副标题 | 次级标题,略小、略淡 |
变量名 in b | body | 正文 | 较长说明文字,左对齐自动换行 |
变量名 in link | — | 链接 | 把值渲染成可点击的按钮链接 |
变量名 in p | img | 图片 | 居中显示图片,带圆角阴影 |
示例
it 大标题 t 这是居中的大标题
it 副标题 t 这是居中的副标题
it 正文 t 这是正文样式,适合写较长的说明文字
it 链接 t https://SimpleHC.github.io
it 配图 p
大标题 in t
副标题 in s
正文 in b
链接 in link
配图 in p
要点
in前面的名字,必须是已经用it声明过的变量名,否则该行会被忽略。in link会把值当作链接地址,渲染成绿色按钮,点击在新标签页打开。- 每行
in会在页面上生成一个独立区块。 - 如需把内容放到指定位置,请用
变量名 in point x y,详见「14 图形化定位」。
- 把五种样式各写一遍,观察标题、副标题、正文、链接、图片的差异。
- 试试
in text/in sub/in body等价写法。 - 把
in b换成一段更长的文字,体验自动左对齐换行。
05条件判断 if / orif / noif
根据条件决定显示哪些内容,是让页面「变聪明」的关键。
三种关键词
if 条件:—— 条件成立时执行下方缩进块。orif 条件:—— 「否则若」,可写多个,紧跟在前面的if/orif之后。noif:—— 「否则」,相当于「上面的条件都不满足」;注意 noif 后面不带条件。
示例
it 分数 int 85
if 分数 >= 90:
优秀 in t
orif 分数 >= 60:
及格 in t
noif:
需努力 in t
- 分数 85:不满足第一个条件,满足第二个,显示「及格」。
- 缩进表示「属于谁」:
优秀 in t缩进在if下,表示它是 if 命中时才执行的内容。
条件后面要加英文冒号 :;块内代码必须比条件行多缩进;同一级代码要保持对齐。
- 把分数改成 95,看是否显示「优秀」;改成 50,看是否显示「需努力」。
- 增加一条
orif 分数 == 59:中间分支。
06表达式与运算符
条件里可以写表达式,SIMPLE 支持四则运算、比较、逻辑、包含四类运算。
运算符
| 类别 | 运算符 | 含义 | 示例 |
|---|---|---|---|
| 四则 | + - * / % | 加 / 减 / 乘 / 除 / 取余 | 2 + 3 * 4 |
| 比较 | == | 等于 | 年龄 == 18 |
| 比较 | != | 不等于 | 名字 != "张三" |
| 比较 | < > <= >= | 小于 / 大于 / 小于等于 / 大于等于 | 分数 >= 60 |
| 逻辑 | and | 且(都成立) | a and b |
| 逻辑 | or | 或(任一成立) | a or b |
| 逻辑 | not | 非(取反) | not a |
| 包含 | in | 右侧是否包含左侧子串 | "hello" in "xxhello" |
四则运算
- 支持
+ - * / %及一元负号(如-5),遵循先乘除、后加减,可用小括号()改变优先级。 - 示例:
2 + 3 * 4等于14;(2 + 3) * 4等于20;10 % 3等于1。 - 变量的值是数字时可直接参与运算,如
满分 - 已扣 >= 60。
字面量
- 数字:
18、3.14 - 字符串:
'你好'或"你好"(单双引号均可) - 布尔:
true、false - 空值:
None
比较规则
- 两侧都是数字时按数值比较;否则按字符串比较。
in用于子串包含判断。
组合示例
it 年龄 int 18
it 名字 t 张三
if 年龄 == 18 and 名字 in '张三':
匹配 in t
- 用
or/not/in组合条件写到if里。 - 改数字和字符串做比较,观察结果变化。
08语法规范
几条必须遵守的基本规则,遵守后代码几乎不会出错。
缩进
- 用缩进表示层次,同一代码块必须对齐。
Tab会被当作 2 个空格;建议统一用 2 或 4 个空格。- 只有
if / orif / noif下面需要缩进块,其余语句顶格写。
注释
- 以
#开头的行是注释,会被忽略。 - 例:
# 这是一行注释
空行与骨架
- 空行自动忽略,可用空行给代码分区。
- 页面自带 HTML 骨架,不要写
<html>/<head>/<body>/<style>等标签。 - 编辑器顶部有快捷提示,忘记语法时可参考。
- 添加注释、空行,保持缩进一致。
- 故意打乱缩进,观察转译异常,再改回正确缩进。
09项目与图片管理
学会管理左侧的项目 / 页面树,以及给图片变量上传图片。
项目 / 页面树
- 新建项目:点「项目」旁
+。 - 新建页面:点「页面」旁
+。 - 重命名 / 删除:鼠标移到项目或页面上,点
✎(重命名)或🗑(删除)。 - 删除不可恢复,请谨慎操作。
图片上传
- 先用代码声明图片变量,如
it 头像 p。 - 切到「变量」标签,找到「头像」条目。
- 点「上传」选择本地图片;「更换」替换图片、「删除」移除图片。
- 图片会以 dataURL 内嵌保存,随
.hc一并导出,不会丢失。
变量面板
- 展示当前页面所有变量:普通、文字
t、图片p。 - 图片变量拥有专属的「上传 / 更换 / 删除」按钮。
- 在变量面板上传一张图片,观察显示效果。
- 尝试「更换」和「删除」图片。
10实时转译与导出
SIMPLE 会实时转译为 HTML,你可以随时预览,并把成果导出成网页或可继续编辑的工程文件。
实时转译
- 编辑时引擎实时把 SIMPLE 转译为 HTML,切到「转译预览」即可看到结果。
- 点「↗ 新标签打开」可独立预览。
- 点顶部「✓ 实时转译」立即转译当前页。
导出
- 导出 .hc:保存项目(含图片),之后可用「导入项目 .hc」继续开发。
- 导出单个 .html:只导出当前页面。
- 导出全部页面 · 打包 .zip:所有页面打包成 zip(多文件)。
- 导出全部页面 · 合并成 1 个 .html:合并成单文件,含顶部导航,可点击跳转。
重要项目请养成「导出 .hc」备份的习惯;网页端数据保存在浏览器本地,清缓存可能丢失。
- 分别尝试 4 种导出方式。
- 导出
.hc再重新导入,确认数据完整。
11完整案例:个人名片
做两张页面——「名片」和「联系方式」。名片显示头像、判断是否成年,并跳到联系方式页。
步骤
- 新建项目「个人名片」。
- 把默认页面「页面1」重命名为「名片」,写入:
it 姓名 t 张三
it 简介 t 一名热爱编程的初学者
it 头像 p
it 年龄 int 20
姓名 in t
简介 in t
头像 in p
if 年龄 >= 18:
成年人 in t
noif:
未成年人 in t
to 联系方式
- 切到「变量」面板,为「头像」上传图片。
- 新建页面「联系方式」,写入:
it 邮箱 t zhang@example.com
邮箱 in t
to 名片
- 切「转译预览」查看效果。
- 点「导出全部页面 · 合并成 1 个 .html」下载,即可得到一个可跳转的完整网页。
- 复刻个人名片案例。
- 扩展一个「技能」页面,并加入跳转。
12语法速查表
一页看完 v3.88 全部语法,可收藏备用。
| 功能 | 语法 |
|---|---|
| 声明普通变量 | it 名字 [类型] [值] |
| 声明文字变量 | it 名字 t 值 |
| 声明图片变量 | it 名字 p |
| 显示大标题 | 名字 in t(text 等价) |
| 显示副标题 | 名字 in s(sub 等价) |
| 显示正文 | 名字 in b(body 等价) |
| 显示链接 | 名字 in link |
| 显示图片 | 名字 in p(img 等价) |
| 图形化定位 | 名字 in point x y(x、y 为像素坐标,可引用数值变量) |
| 条件判断 | if 条件: / orif 条件: / noif: |
| 页面跳转(同项目) | to 页面 或 页面A to 页面B |
| 跨项目跳转 | fr 项目A 页面A to 项目B 页面B |
| 注释 | # 注释内容 |
| 四则运算 | + - * / % ( ),如 2 + 3 * 4 |
| 比较 / 逻辑 / 包含 | == != < > <= >= and or not in |
- 对照速查表,自查一遍全部语法。
- 在空项目里,把每类语法各写一条。
13常见问题
遇到问题先来这里排查。
- 为什么
标题 in t没显示?
变量名未声明或拼写不一致。请先用it 标题 t ...声明。 in那行没效果?in前面的变量名必须与it声明完全一致。- 缩进不对会怎样?
可能把代码分到错误的块,导致 if 逻辑异常;保持块内代码对齐即可。 - 图片为什么是空的?
图片变量需要在「变量」面板上传图片,it 图片 p只是声明。 - 跳转点了没反应?
跨项目跳转的目标项目未一并导出;导出时记得包含目标项目。 - 数据保存在哪里?
浏览器 localStorage,清缓存会丢失;请用「导出 .hc」备份重要项目。 int/str等类型有效吗?
v3.88 目前统一按普通变量处理,暂不做类型约束;数值变量会按数字参与四则运算与数值比较。
- 故意用未声明的变量名写
in,观察效果。 - 再修正成正确写法,养成自查习惯。
14图形化定位 in point
想让某个内容出现在页面的指定位置?v3.88 新增「图形化编程界面」,在画布上点一下就能确定坐标,自动生成 变量名 in point x y 代码,所见即所得。
语法
- 文字点:
变量名 in point x y—— 把变量内容放到坐标(x, y)处。 - 图片点:
变量名 in point x y—— 若变量是图片p,则在该坐标显示图片。 x和y分别是横、纵坐标,单位为像素 px,以页面左上角为原点。
it 点A t 我在这里
点A in point 180 120
坐标也可以用变量
x、y 除了写具体数字,还能引用数值变量,让位置由逻辑决定:
it 坐标X int 320
it 坐标Y int 240
it 点B t 由变量定位
点B in point 坐标X 坐标Y
用图形画布确定坐标
- 在编辑区顶部切到「图形画布」标签。
- 输入变量名,选择「文字 t」或「图片 p」,填好「内容」。
- 在画布上点击任意位置,会出现一个定位点并显示坐标。
- 点「插入坐标点」,引擎会自动在同一页面生成变量声明和
变量名 in point x y。 - 切到「转译预览」,即可看到内容精确落在你点击的位置。
如果选了「图片 p」,图片本身请到「变量」面板上传;画布只负责生成位置的坐标代码,不含图片数据。
坐标点是绝对定位,会盖在普通排版内容之上;坐标值建议在画布内(画布尺寸即参考视口),过大可能超出屏幕。
- 下载本章练习,观察三个坐标点的位置差异。
- 在图形画布上点一个点,插入坐标代码,验证「点击处 = 显示处」。
- 把
坐标X / 坐标Y改成别的数字,看「点B」如何随之移动。
15图形化前端开发
v2.00 为 SIMPLE 增加四大能力:触发区域色块、URL 图片、文件下载、Python 标准库导入,并内置图形化编程界面(色块创建、触发区域),让「简单的点击也能带动一段逻辑」。
① 触发区域色块(cf / stop)
用 cf 区域名 标记一段代码开始,用 cf 区域名 stop 标记结束。转译后这段代码会被渲染成一个彩色的「色块」。用户点击该色块,或长按约 0.6 秒,即可展开 / 收起这段内容。
cf 卡1
it 提示 t 点击我试试
提示 in s
cf 卡1 stop
cf是「click-fire / 点击触发」的关键词,后面的卡1是触发区域名称,可自由起名。- 缩进在
cf 卡1与cf 卡1 stop之间的代码,就是点击 / 长按后才展示的「那一段」。 - 区域未展开时内容隐藏;点一下展开,再点一下收起。
- 编辑器顶部「+ 触发区域」代码片段按钮可一键插入模板。
② 图片变量直接填 URL
v3.88 的图片变量 it 名字 p 只能上传本地图片。v2.00 支持直接填一个图片 URL,转译后自动从该地址加载,无需上传:
it 徽标 p https://picsum.photos/400/300
徽标 in p
- 写法仍是
it 名字 p URL,只要值是http(s)://或data:开头,就会被当作网络图片直接引用。 - 在「变量」面板里同样可以把图片 URL 填进去。
③ 文件下载(app / d)
想让用户下载一个文件?v2.00 可用 it 名 app 声明一个「可上传文件的变量」,再用 名 in d 在页面渲染一个下载按钮,点击后浏览器弹出下载。
it 安装包 app
安装包 in d
app变量需要到「变量」面板上传一个文件(任意类型)。名 in d(download等价)把该文件渲染成下载按钮,用户点击即下载你上传的文件。- 导出限制:只要使用了「文件下载」,导出请选「打包 .zip」,以保证下载文件被正确包含。
.hc与合并单文件导出会提示改用 zip。
④ Python 标准库导入(use)
v2.00 在需要后端 / 原生运行时能力的环境中支持用 use 声明式导入常用标准库,让 SIMPLE 代码能表达「系统操作、数据处理、时间、存储、网络并发」等更底层的逻辑:
use os, sys, subprocess, math, json, re
use time, datetime, shutil, tempfile
use zipfile, gzip, pickle, sqlite3, urllib
use threading, asyncio
| 分类 | 模块 | 用途 |
|---|---|---|
| 系统 | os sys subprocess | 文件目录、环境变量、解释器信息、执行系统命令 |
| 数学 / 数据 | math random decimal json csv re string | 数学函数、随机数、高精度、JSON/CSV、正则与字符串 |
| 时间 / 文件 | time datetime shutil tempfile zipfile gzip | 时间函数、文件高级操作、临时文件、压缩包 |
| 存储 | pickle shelve sqlite3 | 对象序列化、字典式持久化、SQLite 数据库 |
| 网络 / 并发 | urllib threading asyncio | 访问网页、多线程、异步 I/O |
use 走「白名单校验 + 声明式」设计:编译期记录依赖,是否实际执行交给你所选择的运行时(网页端作为前端展示层只做识别与透传,原生 / 后端运行时才会真正调用这些系统能力)。这样可避免在纯前端环境里泄露敏感系统操作。
- 下载本章练习
.hc并导入,在「触发区域」页点 / 长按两个色块,看cf包裹的内容如何展开收起。 - 把「徽标」图片 URL 换成任意网络图片,刷新预览。
- 在「URL图片与下载」页为
安装包上传一个测试文件,点击下载按钮验证。 - 用「打包 .zip」导出,确认下载文件被包含、功能可用。
16原生 HTML 块
想直接写一段 HTML 网页元素?v3.01 新增「原生 HTML 块」:用 html:( … )end 包裹,括号里的内容 SIMPLE 完全不做编译,而是原样放进最终导出的 HTML 中。
① 语法
html:(
<div class="card">这里可以放任意 HTML</div>
)end
html:(是块的开始标记,)end是块的结束标记。- 两标记之间的所有内容(多行都行)都会被原样保留,不会参与 SIMPLE 编译。
- 括号里的
#不会被当成注释,it/in等 不会被当成 SIMPLE 语句——它们都是普通 HTML / 文本。
② 从上往下编译,位置即顺序
HTML 块和其他 SIMPLE 语句一样,遵循从上到下的声明顺序。下面这段代码——
it 标题 t 卡片页
html:(
<div>原生 HTML 块</div>
)end
标题 in t
编译顺序是:先 it 标题(声明变量)→ 再 html:(…)(注入原生 HTML)→ 最后 标题 in t(展示标题)。导出后,HTML 块会出现在它声明的位置。
这和非 HTML 块的混排一致:引擎始终按你在代码里书写的先后顺序逐条处理。想明白「先声明、再注入、后展示」的顺序,只要把 html:(…) 看成一个普通语句即可。
③ 能放什么
| 类别 | 示例 |
|---|---|
| 普通元素 | <div> <span> <p> <h1>…<h6> |
| 表单 / 交互 | <button> <input> <form> |
| 媒体 | <img> <video> <audio> |
| 表格 / 列表 | <table> <ul> <ol> |
| 内联样式 | style="…" 属性,例如给元素上色、圆角、间距 |
④ 编辑器内快速插入
网页端编辑器顶部有一个「+ 原生 HTML」代码片段按钮,点击即可一键插入 html:( … )end 模板。直接 html 与 end 关键字还会被高亮,方便辨认块的边界。
HTML 块内容最终会原样进入导出的页面,SIMPLE 引擎不会对括号内的 HTML 做任何校验或转义,所以请自己保证 HTML 语法正确。块内如需引用 SIMPLE 变量,目前需手动拼接,引擎不会自动替换。
- 下载本章练习
.hc导入,在「HTML块基础」页看彩色卡片,确认其是原生 HTML、未被 SIMPLE 编译。 - 在自己代码里写一个
html:( … )end,放一个带style的按钮,实时转译预览。 - 验证声明顺序:先
it→ 再html:(…)→ 后in,看最终导出里 HTML 块是否位于对应位置。 - 在 HTML 块内故意写一行
it 测试 t xxx,确认它被原样输出、不会被当作变量声明。
17三版发布 + 编译 Python / C++
v3.66 起 Simple 每次发布都分为三种版本,并且把「能编译其他语言成 HTML」这一能力按版本开放:M(轻量)仅内部 SIMPLE、R(标准)加 Python、X(全能)再加 C++。
① 三种版本
| 版本 | 全称 | 可被 SIMPLE 编译为 HTML 的语言 | 适用 |
|---|---|---|---|
M | 轻量版 | 仅 SIMPLE 内核 | 最常用、最精简的纯 SIMPLE 开发 |
R | 标准版 | SIMPLE + Python(py:(…)) | 需要在页面里跑 Python 逻辑 |
X | 全能版 | SIMPLE + Python + C++(py:(…) / cpp:(…)) | 同时兼顾 Python 与 C++ 能力 |
这里的「Python / C++ 能力」不是在 SIMPLE 里调用它们的官方库,而是让 SIMPLE 自己支持编译这些语言:把 py:(…) / cpp:(…) 括号内的源码编译成 HTML。即把 SIMPLE 扩展成一个可以编译多种语言的“编译器宿主”。
② Python 编译块 py:( … )end
py:(
print('你好,SIMPLE 编译的 Python')
for i in range(3):
print('n =', i)
)end
py:(开始,)end结束,中间的 Python 源码会按声明顺序保留。- 导出时,SIMPLE 内置的转译器把这段 Python 编译成 HTML 输出,页面里会出现一个「编译运行」区。
- 块内
#是 Python 注释,不会被当成 SIMPLE 备注;it/in也不会被当成 SIMPLE 语句。 py3:(…)与py:(…)等价,都归并为 Python 块。- 该能力在
R、X版可用;M版会提示「本版本未含 Python 编译能力」。
③ C++ 编译块 cpp:( … )end
cpp:(
#include <iostream>
using namespace std;
int main() {
cout << "你好,SIMPLE 编译的 C++";
return 0;
}
)end
- 同样用
cpp:( … )end包裹,SIMPLE 内置转译器把 C++ 源码编译为 HTML 输出。 cxx:(…)与cpp:(…)等价。- 该能力仅在
X全能版可用;R、M版会按各自边界提示。
④ 完全自包含,不请求外部库
为满足“离线可用”,以上编译全部由 SIMPLE 内置的转译宿主完成:导出的 HTML 页面不引用任何外部官方库、不加载 CDN、不访问任何网址,Py/C++ 块在导出页里各自生成一个可点击执行的「编译运行」区域并实时输出结果。
网页端编辑器顶部提供「+ Python」(R/X 版可见)与「+ C++」(X 版可见)代码片段按钮,一键插入对应块模板;py / py3 / cpp / cxx 与 end 关键字也会被高亮。
- 下载本章练习
.hc导入,在 Python / C++ 页看两个「编译运行」区,分别点击并观察 HTML 输出。 - 用
X全能版导出单页,验证导出页无任何外部请求即可运行。 - 换成
R或M版打开同一项目,观察 py/cpp 块各自给出的“版本能力”提示。 - 改动块内代码(如
for i in range(5)),对照查看实时转译 / 编译输出。
18循环与控制流
SIMPLE v3.88 新增完整控制流语法:while 循环、break / continue、say 带插值输出、set / let 变量声明、add / sub / mul / div 简写、列表 / 字典字面量,让语言从"条件判断"扩展到完整流程控制。
① while 循环
用 while 条件: 开始循环块,缩进内的语句会反复执行直到条件不成立。循环最多 50 次 自动中断(防止死循环)。
set count = 0
while count < 5:
say 第 {count} 次
count add 1
- 条件写法与
if相同:支持>= / < / == / != / and / or / not / in。 - 循环块用 缩进 界定(2 空格起)。
- 最多 50 次自动安全上限。
② break / continue
break 立即跳出循环;continue 跳过本轮后续语句直接进入下一轮。
let i be 0
while i < 10:
i add 1
if i == 3: continue
if i == 7: break
say {i}
输出 1、2、4、5、6(3 被跳过,7 触发 break)。
③ say 输出(带插值)
say 输出一段文本,用 {变量名} 做插值。变量不存在会被替换为空字符串。
set name = Simple
set score = 95
say 你好 {name},你的成绩是 {score} 分
say {name} 的 10 倍是 {score * 10}
④ set / let 变量声明
set 变量名 = 值 或 let 变量名 be 值 声明并赋值一个普通变量。两者等价,set 更像数学赋值,let 更接近函数式直觉。
set x = 10
let y be 20
set sum = x + y
say {sum}
⑤ add / sub / mul / div 简写
对已声明变量做复合运算:变量 add 增量、变量 sub 减量、变量 mul 因子、变量 div 除数。
let a be 5
a add 3 # a = 8
a sub 2 # a = 6
a mul 4 # a = 24
a div 3 # a = 8
⑥ 列表 / 字典字面量
用 [值1, 值2, 值3] 写列表;{键: 值, 键2: 值2} 写字典。在表达式里可直接参与运算或判断。
set nums = [10, 20, 30]
set info = {name: Simple, lang: SIMPLE, ver: v3.88}
say 列表长度 {len(nums)}
say 名字 {info.name}
if 20 in nums:
say 20 在列表里
⑦ 多行注释 //
除了原本的 # 单行注释,v3.88 新增 // 注释,行为完全相同。两种写法都可用。
// 这是 v3.88 新增的注释
# 这是原本就有的注释
set x = 42 # 行尾注释也可以
- 下载本章练习
.hc导入,跑通所有 while 循环示例。 - 改写循环上限为 500 次(超过安全上限),观察自动中断提示。
- 尝试用
set / let+add / mul写一个简单的累加器。 - 创建一个包含 5 个数字的列表,用
len打印它的长度。
19函数与内置函数
SIMPLE v3.88 新增编译期内联函数:用 fn 定义、call 调用、return 提前结束、raise 抛出中断。所有函数在编译期被展开,不增加运行时开销。同时提供 11 个内置函数 覆盖常用场景。
① fn / call 定义与调用
用 fn 函数名(参数1, 参数2): 开始定义,fn end 结束;用 call 函数名(实参1, 实参2) 调用。编译期会把函数体内联展开到调用位置。
fn add(a, b):
let r be a + b
say {a} + {b} = {r}
fn end
fn greet(name):
say 你好,{name}
fn end
call add(10, 5)
call greet(Simple)
call add(100, 200)
- 参数名与实参值按顺序对应,编译期会做「保存旧值 → 注入新值 → 恢复旧值」。
- 函数体内可以使用任何 SIMPLE 语句(if / while / say / 变量声明等)。
- 不支持嵌套高阶函数(fn 里再 fn),但顶层 fn 可互相调用。
- 调用不存在的函数不会报错,编译期会输出
[unknown function 名字]提示。
② return 提前返回
在 fn 体内用 return 可提前结束函数执行,后续语句不再运行。可选写 return 值 把值存到内部变量(供 call 方之后判断)。
fn check(score):
if score >= 60:
say 及格
return
say 不及格
fn end
call check(85) # → 及格
call check(30) # → 不及格
③ raise 中断
raise 消息 会立即中断后续所有代码执行(不仅是当前函数),类似"抛异常"。适合表达不可恢复的错误。
fn divide(a, b):
if b == 0:
raise 除数不能为零
let r be a / b
say 结果 {r}
fn end
call divide(10, 2) # → 结果 5
call divide(10, 0) # → 报错并中断
raise 是编译期行为,不是真正的异常抛出:它会在输出面板标记一个 红色中断提示,编译后续节点全部跳过。没有 try-catch,raise 出来就没了。
④ 11 个内置函数
| 函数 | 参数 | 返回值 | 说明 |
|---|---|---|---|
len(x) | 字符串 / 列表 / 字典 | 整数 | 字符串长度、列表元素数、字典键数 |
range(end) | 1~3 个参数 | 列表 | range(5) → [0,1,2,3,4];range(2,8) 步长 1;range(0,10,2) 步长 2 |
max(a, b, ...) | 多个数字或单个列表 | 数字 | max(3,7,2,9) → 9;max([1,5,3]) → 5 |
min(a, b, ...) | 同 max | 数字 | min(3,7,2,9) → 2 |
abs(x) | 数字 | 数字 | abs(-42) → 42 |
sqrt(x) | 数字 | 浮点数 | sqrt(16) → 4 |
round(x) | 数字 | 整数 | round(3.7) → 4;round(3.2) → 3 |
toStr(x) | 任意值 | 字符串 | 数字 / 布尔 → 字符串 |
toNum(x) | 字符串 / 数字 | 数字 | toNum("42") → 42 |
now() | 无参数 | 当前时间 | 返回毫秒时间戳(Date.now()) |
push(列表, 值) | 列表 + 值 | 新列表 | push([1,2], 3) → [1,2,3] |
let nums be [3, 7, 2, 9, 5]
say 最大 {max(nums)}
say 最小 {min(nums)}
say 长度 {len(nums)}
say sqrt 16 = {sqrt(16)}
let squared be []
let i be 0
while i < 5:
set v = i * i
squared = push(squared, v)
i add 1
say 平方序列 {squared}
- 下载本章练习
.hc导入,跑通所有函数定义与调用示例。 - 写一个
fn factorial(n)计算阶乘(提示:可以用 while 循环 + if 判断终止条件)。 - 写一个
fn greet带 return 的函数,call 它两次观察输出。 - 用
range + while生成一个 1~100 的列表,再用len / max / min验证。
20sru 用户输入
sru 是 SIMPLE 语言第一个交互语法:一行代码在页面上生成一个输入框,让用户输入数据,自动赋值到指定变量。支持缩放、交互模式、圆角三个参数。
① 最简写法
只写关键字 + 目标变量,其余参数自动取默认值。
sru = name // 默认 100% 宽度,自动载入,圆角
sru(80) = age // 80% 宽度
② 完整写法(3 参数)
sru(100), t, y = username
// ↑ ↑ ↑
// 宽度 模式 圆角
// 10~100 t=手动 y=圆角
// f=自动 f=直角
| 参数 | 位置 | 可选值 | 说明 |
|---|---|---|---|
(缩放) | 括号内第一个 | 10 ~ 100 | 输入框宽度百分比,默认 100 |
,t/f | 第一个逗号后 | t / f | t=手动点"确定"按钮才载入;f=边打边自动更新 |
,y/f | 第二个逗号后 | y / f | y=圆角(默认);f=直角(适合老式终端风格) |
=变量名 | 最后 | 合法标识符 | 用户输入的值赋值到这个变量 |
③ 两种交互模式对比
// f = 自动载入 — 打字时实时更新变量
sru(100), f, y = search
say 你正在输入 {search}
// t = 手动载入 — 用户点"确定"按钮才赋值
sru(80), t, y = password
say 已收到:{password}
④ 与 int / double / str 配合使用
sru 读进来的一律是字符串。如果需要数字,用类型转换函数包一层。
sru = rawAge
set age = int(rawAge)
say 你今年 {age} 岁,明年 {age + 1} 岁
sru(60), t, y = score
set scoreNum = double(score)
say 原始 {score} → 数字 {scoreNum} × 2 = {scoreNum * 2}
- 下载
ch20-input.hc导入,分别跑 live 模式 和 confirm 模式。 - 试把缩放改成 30/50/80/100,看效果差异。
- 用
sru = a + sru = b + say {a+b}实现两数相加计算器(提示:两个 sru,一个 say,注意 live 模式下变量更新时机)。
21int / double / str 类型转换
sru 读进来的值一律是字符串。int / double / str 三个内置函数让你在 SIMPLE 代码里自由转换类型,写加减乘除、做判断都更方便。
① int(x) — 整数
set n = int(42.7) // n = 42(截断小数)
set x = int("-99") // x = -99(字符串→整数)
let bad be int("hello") // 返回原始字符串(转换失败不报错)
② double(x) — 浮点数
set pi = double("3.14159") // pi = 3.14159
let half be double(1) / 2 // half = 0.5
③ str(x) — 字符串
sru = scoreRaw
set score = double(scoreRaw)
say 得分是 {score}
set note = str(score) + " 分,原始输入 " + scoreRaw
say {note}
- 下载
ch21-types.hc导入,跑通三个类型转换函数的所有示例。 - 写一个 BMI 计算器:两个 sru(身高 cm / 体重 kg)+ double 转换 + say 输出。
