Fun 语法三则:花括号、块尾分号、点号后的关键字

bash 复制代码
作者: 一了 <1liao3@funlang.org>
日期: 2026-11-04

一句话总结: Fun 这几天落了三处语法加法:if、while、for 可用花括号,`end if` 一类块尾可省分号,点号后的保留字当普通成员名。旧写法全保留,例子在 9.5.4 上跑过。
  

Fun 语法三则:花括号、块尾分号、点号后的关键字

Fun 的核心仓库在这几天落了三处语法改动。都不大,但都会改变每天写代码的手感:if、while、for 多了一种花括号写法;end if 这类块尾可以不带分号;点号后面的保留字可以当普通成员名用。

旧写法一个都没删。下面的例子都在 Fun 9.5.4 上跑过。

一、if / while / for 可以直接用花括号

以前条件分支必须用 then 开头、用 end if 收尾。现在如果只有一个分支,可以写成 if 表达式 { ... }:

bash 复制代码
var score = 72;

if score >= 60 {
  ?. 'pass';
}

then 不用写,end if 换成 }。while 和 for 也接受同一种块:

bash 复制代码
var i = 0;

while i < 3 {
  ?. i;
  i = i + 1;
}

for n = 1 to 3 {
  ?. n * 10;
}

for name in ['Ada', 'Linus'] {
  ?. name;
}

输出是:

bash 复制代码
pass
0
1
2
10
20
30
Ada
Linus

块里再套块也没问题:

bash 复制代码
for n = 1 to 3 {
  if n mod 2 = 1 {
    ?. n;
  }
}

这段只打印 1 和 3。

边界要说清楚:花括号版目前只覆盖单支的 if。需要 else 或 elsif 时,仍然用 then ... end if:

bash 复制代码
if score >= 60 then
  ?. 'pass';
else
  ?. 'fail';
end if

if ... { ... } else ... 这种混写现在还不成立,单独的 loop 也仍然是 loop ... end loop。花括号替换的是条件块的开头和结尾,块里的语句照样要分号;闭括号后面写不写分号都可以。

二、end 后面的分号可以省

从 9.4.9 起,end if、end case、end loop、end do、end try、end fun、end class 后面的分号都可以省略。原来的写法仍然接受。

以前的函数这样收尾:

bash 复制代码
fun double(n)
  return n * 2;
end fun;

现在可以写成:

bash 复制代码
fun double(n)
  return n * 2;
end fun

?. double(21);

省掉的只是 end <block> 后面那一个分号。块里的最后一条语句、end 前面那条语句,分号还在。

这也不是自动分号插入。Fun 不会因为换行就结束一条语句;两条普通语句之间少写分号,仍然会粘在一起。所以能省的地方只有块尾:

bash 复制代码
if score > 0 then
  ?. 'positive';
end if
?. 'after if';

这里省掉的是 end if 后面的分号,?. 'positive'; 和 ?. 'after if'; 的分号都不能省。end if; 也还是合法写法,老代码不用改。

三、点号后面的保留字是普通成员名

9.4.9 还改了词法器:. 和 ?. 后面出现保留字时,按成员名处理。JSON、数据库、外部接口里常见的 fun、end、if 字段,现在可以直接点出来:

bash 复制代码
var row = new [];

row.fun = 'Fun';
row.end = 42;
row.if = true;

?. row.fun;   # Fun
?. row.end;   # 42
?. row?.if;   # True

Fun 的 40 个保留字都能这样用:o.class、o.var、o.while、o.not、o.bit 都行。?. 后面同样适用,像 row?.if 这种可选成员访问不会把 if 当成分支关键字。

软关键字只软在点号后面。fun 出现在语句开头仍然是函数定义,if 出现在条件位置仍然是分支,end 出现在块尾仍然是收尾。换个位置,它们还是关键字。

构造字面量时用字符串键:

bash 复制代码
var row = ['fun': 'Fun', 'end': 42];

?. row.fun;
?. row['end'];

这样建出来的对象,两种读法都能拿到值。顺带一提,type 不是关键字,它只是标准库里的函数,o.type 本来就不会和词法器打架。

四、旧代码不用改

三处都是加法,不是替换:花括号是新增写法,块尾分号是可省可留,点号后的保留字是放宽。9.4.9 到 9.5.4 之间的代码都能继续跑。

如果只想先试一处,花括号最适合新写的短分支;块尾分号适合把已经写完的代码顺手清一遍;点号后的软关键字,则留给那些字段名绕不开保留字的外部数据。

相关推荐
codigger5 小时前
2026年,AI PC靠什么反超传统PC?
ai·大模型·编程语言
Patrick_Wilson18 小时前
Go 为什么需要 defer?从函数怎么收尾说起
后端·go·编程语言
Patrick_Wilson19 小时前
从文本输出理解 Go 方法与接口
后端·go·编程语言
Patrick_Wilson1 天前
读懂一个 Go JSON 处理函数:从输入数据追踪结构体、校验与错误返回
go·json·编程语言
Patrick_Wilson1 天前
第一次读 Go 项目:从两个源码文件弄清 package、import 和 go.mod
后端·go·编程语言
Patrick_Wilson1 天前
执行 go build . 后,Go 怎样找到代码并生成程序
后端·go·编程语言
Patrick_Wilson1 天前
Go 变量不赋值时,为什么也有值
后端·go·编程语言
Patrick_Wilson1 天前
读 Go 项目里的命令:run、build、test 分别做了什么
后端·go·编程语言
灿飞2 天前
Mojo编程七:函数、参数约定与高阶编程
编程语言