Heyo 教程 说明书 特性 下载 Studio
docs / getting-started / hello.hy

Heyo v0.1

为初学者设计的编程语言。say 打印、is 赋值、need 定义函数——关键词就是日常用语,中文变量名随意用。

hello.hy● 运行成功 · 0.02s
// 30 秒学会 Heyo
name is "小明"
age is 12

say "你好", name, ",你", age, "岁了"

need double(n)
    return n * 2
done

say double(age)
你好 小明 ,你 12 岁了 24

使用说明书

每开发一个语法,这里就多一篇。全部示例都在真实解释器里运行过。

GUIDE 01

is 变量与赋值

给名字装进一个值。不用 = 号,is 就是「是」。

名字 is "小明" 年龄 is 12
阅读指南 →
GUIDE 02

say 打印输出

让电脑说话,逗号隔开一次说多样。

say "你好", 名字, "!"
阅读指南 →
GUIDE 03

when 条件判断

如果…就…,支持 elsewhen 和 else 分支。

when 年龄 > 18 -> say "成年" else -> say "幼儿"
阅读指南 →
GUIDE 04

need 定义函数

把代码打包成自己的工具,return 交回结果。

need 双倍(n) return n * 2 done
阅读指南 →
GUIDE 05

again 循环

条件循环和列表遍历两种形态。

again x in [10, 20, 30] say "拿到", x done
阅读指南 →
GUIDE 06

stop/skip 循环控制

stop 跳出整个循环,skip 跳过这一轮。

when n == 3 -> skip when n == 5 -> stop
阅读指南 →
GUIDE 07

[ ] 列表

一排格子。push 加元素,len 数个数。

数字 is [3, 1, 2] push(数字, 4)
阅读指南 →
GUIDE 08

{ } 字典

贴标签存值,.标签 直接取。

用户 is {名字: "嘿", 分数: 99} say 用户.分数
阅读指南 →
GUIDE 09

. 字符串成员

变大写、拆分、量长度,点号唤出。

s is "Hello" say s.upper
阅读指南 →
GUIDE 10

read/write 文件读写

write 存进文件,read 读回来。

write "a.txt" <- "内容" read "a.txt" -> 文本
阅读指南 →
GUIDE 11

use 导入模块

用 use 拿来自己写的文件,里面的函数直接能用,不用 import。

use "我的工具.hy" say 三倍(14) // 42
阅读指南 →
GUIDE 12

serve 后端服务

10 行 Heyo 写一个网站后端,像 Python 一样部署。

need api(req) return {status: 200, body: "你好"} done serve 8080, api
阅读指南 →
GUIDE 13

random 做游戏

随机数 + ask 交互,猜数字游戏 12 行写完。

答案 is random(1, 100) ask 猜 "猜: " when 猜 == 答案 -> say "对了!"
阅读指南 →

指南详情

每篇 3 分钟,点开跟着敲一遍就会。

01is 变量与赋值›

is 读作「是」。年龄 is 12 就是「年龄是 12」。之后随时可以再 is 一次,值会被换掉。

name is "小明"
age is 12
price is 3.14
happy is yes      // 布尔值:yes / no

age is 13        // 重新赋值,变成 13

变量名中文英文都行。数字有小数和整数,文字要用引号包住。

yes 和 no 不是文字,是布尔值——打印出来就是 yes / no,不带引号。
02say 打印输出›

say 让电脑把东西显示出来,逗号隔开的东西用空格连在一起。

say "你好"
say "我", "是", name          // 我是 小明
say "1+2=", 1 + 2            // 1+2= 3
say [1, 2, 3]                // [1, 2, 3]

say 什么都能打:文字、数字、列表、字典、算式结果。不知道一个东西长什么样?say 一下。

调试秘诀:任何拿不准的地方加一句 say,跑一下看输出——所有程序员的第一调试法。
03when 条件判断›

when = 如果。两种写法:

// 单行:条件 -> 一句话
when age > 18 -> say "成年"

// 多行:换行缩进,done 收尾
when age > 10
    say "十岁以上"
    say "还在长大"
done

多分支用 elsewhen(否则如果)和 else(否则),从上往下检查,命中一个就跳过其余:

when score >= 90 -> say "优秀"
elsewhen score >= 60 -> say "及格"
else -> say "要加油"

比较符号:> < >= <= ==(等于)!=(不等于)。等于要写两个等号。

单行适合一句话;两句话以上用 done 块。注意:一条 when/elsewhen/else 链只在最后写一个 done,不是每个分支各写一个。忘了写 done 会报错提醒。
04need 定义函数›

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,方便定位。
05again 循环›

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
条件永远成立的循环停不下来(死循环)。桌面版有 8 秒保护会自动强杀。
06stop/skip 循环控制›

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
记忆法:skip 是「这个不要」,stop 是「不干了」。
07[ ] 列表›

列表是一排格子,方括号包住,逗号隔开:

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
第一格是 [0] 不是 [1]。数错格子是全人类程序员的共同起点。
08{ } 字典›

字典给每样东西贴标签:

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
09. 字符串成员›

文字自带几个小工具,点号唤出(是成员,不用加括号):

s is "Hello Heyo"

say s.upper       // HELLO HEYO
say s.lower       // hello heyo
say s.split       // [Hello, Heyo]
say s.len         // 11
组合技:say text(123) + "分" —— text() 把数字变文字再拼接。
10read/write 文件读写›

write 用 <- 把值推进文件,read 用 -> 把文件读进变量:

write "日记.txt" <- "今天学会了文件读写"
read "日记.txt" -> content
say content                // 今天学会了文件读写

读回来的都是文字,数字要用 num() 转:

write "分数.txt" <- 98
read "分数.txt" -> sec
say num(sec) + 1          // 99
箭头方向就是数据流向:write 时数据进文件(<-),read 时数据出文件(->)。
11use 导入模块›

Heyo 不用 import,用 use——「拿来用」:

use "我的工具.hy"     // 导入自己写的文件

say triple(14)           // 工具文件里定义的函数直接能用

工具文件「我的工具.hy」里正常写函数就行:

// 我的工具.hy
need triple(n)
    return n * 3
done

use 只会导入文件里的函数和变量定义,不会执行文件里的 say 之类的语句——所以工具文件里写什么 say 都不会被打印。

路径相对于运行时所在目录。不带 .hy 也可以:use "我的工具"。
12serve 后端服务›

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 字符串变字典
部署:任何能跑 Python 的服务器(比如你的 liuxiaoxu.com)把 heyo.py 和程序传上去,python3 heyo.py api.hy 就上线了。
13random 做游戏›

游戏三件套: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",做排行榜文字
进阶:用字典存角色 {名字: "勇者", 血量: 100, 攻击: 12},打怪就是 怪.血量 is 怪.血量 - 勇者.攻击。