// 30 秒学会 Heyo name is "小明" age is 12 say "你好", name, ",你", age, "岁了" need double(n) return n * 2 done say double(age)
每开发一个语法,这里就多一篇。全部示例都在真实解释器里运行过。
每篇 3 分钟,点开跟着敲一遍就会。
is 读作「是」。年龄 is 12 就是「年龄是 12」。之后随时可以再 is 一次,值会被换掉。
name is "小明" age is 12 price is 3.14 happy is yes // 布尔值:yes / no age is 13 // 重新赋值,变成 13
变量名中文英文都行。数字有小数和整数,文字要用引号包住。
say 让电脑把东西显示出来,逗号隔开的东西用空格连在一起。
say "你好" say "我", "是", name // 我是 小明 say "1+2=", 1 + 2 // 1+2= 3 say [1, 2, 3] // [1, 2, 3]
say 什么都能打:文字、数字、列表、字典、算式结果。不知道一个东西长什么样?say 一下。
when = 如果。两种写法:
// 单行:条件 -> 一句话 when age > 18 -> say "成年" // 多行:换行缩进,done 收尾 when age > 10 say "十岁以上" say "还在长大" done
多分支用 elsewhen(否则如果)和 else(否则),从上往下检查,命中一个就跳过其余:
when score >= 90 -> say "优秀" elsewhen score >= 60 -> say "及格" else -> say "要加油"
比较符号:> < >= <= ==(等于)!=(不等于)。等于要写两个等号。
need = 需要什么参数。定义自己的工具:
need double(n) return n * 2 done say double(21) // 42 result is double(double(3)) // 12,可以套着用
return 把结果交回去,函数立刻结束。不写 return 的函数返回 empty:
need greet(name) say "嗨", name done greet("小明") // 直接执行:嗨 小明
Error (TypeError) inside function '加', line 3,方便定位。again = 再来一次。两种形态:
// 形态一:条件循环(条件成立就一直做) i is 0 again i < 3 say "循环", i i is i + 1 // 别忘了改条件! done // 形态二:遍历(挨个拿出列表里的每一样) again x in [10, 20, 30] say "拿到", x done
配合内置 range(n) 数数:
again i in range(5) // [0,1,2,3,4] say i done
skip 跳过这一轮进下一轮;stop 整个循环立刻结束。
again n in [1, 2, 3, 4, 5] when n == 3 -> skip // 3 不说 when n == 5 -> stop // 到 5 收工 say n done // 输出:1 2 4
列表是一排格子,方括号包住,逗号隔开:
num is [3, 1, 2] say num[0] // 3(第一格编号是 0!) push(num, 4) // 往末尾加一个 say num // [3, 1, 2, 4] say len(num) // 4
什么都能放,还能套:
mixed is [1, "二", yes, [4, 5]] say mixed[3][1] // 5
字典给每样东西贴标签:
user is {name: "小明", score: 99} say user.name // 小明 user.score is 100 // 改标签的值 say keys(user) // [名字, 分数] say has(user, "分数") // yes
标签不存在时取出来是 empty,可以配合 when:
when user.email == empty say "没填邮箱" done
文字自带几个小工具,点号唤出(是成员,不用加括号):
s is "Hello Heyo" say s.upper // HELLO HEYO say s.lower // hello heyo say s.split // [Hello, Heyo] say s.len // 11
write 用 <- 把值推进文件,read 用 -> 把文件读进变量:
write "日记.txt" <- "今天学会了文件读写" read "日记.txt" -> content say content // 今天学会了文件读写
读回来的都是文字,数字要用 num() 转:
write "分数.txt" <- 98 read "分数.txt" -> sec say num(sec) + 1 // 99
Heyo 不用 import,用 use——「拿来用」:
use "我的工具.hy" // 导入自己写的文件 say triple(14) // 工具文件里定义的函数直接能用
工具文件「我的工具.hy」里正常写函数就行:
// 我的工具.hy need triple(n) return n * 3 done
use 只会导入文件里的函数和变量定义,不会执行文件里的 say 之类的语句——所以工具文件里写什么 say 都不会被打印。
Heyo 内置 HTTP 服务器。serve 端口, 函数一行启动:
need api(req) when req.path == "/" return {status: 200, body: "<h1>我的网站</h1>"} elsewhen req.path == "/api/hello" return {status: 200, body: {msg: "你好", name: req.query.name}} else return {status: 404, body: {error: "没有"}} done done serve 8080, api // 控制台显示: serve: http://localhost:8080
req 是请求字典:
req.method // "GET" / "POST" req.path // "/api/hello" req.query // ?name=x 的字典: req.query.name req.body // POST 的内容,JSON 自动转字典
返回什么决定响应什么:给 {status, body} 就是完整控制;body 是字典/列表自动变 JSON;是文字就是 HTML 或纯文本。
// JSON 往返 say tojson({name: "小明"}) // {"名字": "小明"} readback is fromjson('{"a":1}') // JSON 字符串变字典
游戏三件套:random 随机数、ask 玩家输入、again 主循环。完整猜数字游戏:
answer is random(1, 100) tries is 0 say "我想了个 1 到 100 的数,猜猜!" again yes tries is tries + 1 ask guess "第" + text(tries) + "次: " when guess == answer say "对了!用了", tries, "次" stop elsewhen guess > answer say "大了" else say "小了" done done
游戏常用内置:
random(1, 6) // 骰子 pick(["刀","剑","弓"], random(0, 2)) // 随机抽一件 wait(0.5) // 停半秒,做节奏 find(bag, "药水") // 在不在背包里,位置或 -1 join([1,2,3], "-") // "1-2-3",做排行榜文字