BT语言的语法设计
随笔
2026-04-19
←
链式语法
在设计BT语言的时,初步设定是支持链式语法,因为在使用PHP语言时,函数嵌套太过麻烦,例如: $str = preg_replace('/(\d+)/', '($1)', substr(trim(' hello world! '), 2, 13)); 明明实现一个简单的字符串处理,却不能简化,甚至代码需要从右向左去读,十分费解,所以我就有了开发一套能支持链式语法的脚本语言,这是我的初步定位,经过一段时间的努力,BT语言实现了,支持链式语法,将上面的代码转成BT语言: str = ' hello world! '.trim().substr(2,13).replace(/(\d+)/,'($1)')原型函数的重要性
链式语法的好处非常明显,从左往右执行,也简单易懂,更重要的是你永远不必因为传参而感到困惑! 为什么这么说呢?例如在BT语言中基础数据类型都拥有原型函数,类似Rust和JavaScript的机制,拿str.join()来说,join基于字符串类型实现,所处理的也是str本身,但是在PHP中让人十分困惑,我们举例来说明:
$array = [1, 2, 3, 4, 5];
$string = implode(',', $array);
echo $string; // 输出:1,2,3,4,5
implode这个函数主要处理数组,我们将所有的传参分为两种,一种是用于处理该数据本身的参数,我们称作源数据,例如$array,另一种是辅助参数,例如这个用于分割的逗号:,通过implode这个函数你会发现,源数据放在了第二位,辅助参数放在了第一位,咱们再看一个例子:
$string = "<pre>hello<pre>";
echo trim($string, "<pre>"); // 输出:hello
你会发现源数据参数又放在了第一位,而辅助参数放在了第二位,Why?trim这个函数的第二个参数并不是非必填的,但是两个参数都是字符串类型,程序设定的时候完全可以判断一下,将源数据放在第二位,如果只有一个参数的话,那么将第一个参数做为源数据。
PHP中关于这种函数的参数设定对我来说是很乱的,但是链式语法不一样,你永远不用为传参感到困惑,因为她是基于数据原型的函数,不必传递源数据参数,所以你可以随心所欲的操作:
arr = [1,2,3,4,5]
print arr.map(v->v*2).join(',')
声明函数为什么用fn
BT语言的链式语法参考了Rust和JavaScript,上面这个例子中可以看到函数的关键字用到了fn,这个关键字用于声明函数。 一般的编程语言用function比较多,但BT语言延续了母语Rust的写法,用fn来声明函数,有的语言使用func,说实话,个人非常不喜欢,要简洁就简洁一点嘛,感觉去掉了tion好难看,还不如直接用全称,所以最终考虑了fn。 fn add(x, y=9) { x + y } 在BT语言中,函数的参数可以设置默认值,此方式参考了JavaScript,这里要说明一下,函数的返回值在默认情况下取的最后一条语句,你也可以使用return语句来设置返回值,此方式参考了Rust语言。条件表达式
if a > 10 { print 'ok' } 在BT语言中,条件表达式也参考了Rust,使用if关键字,后面跟一个条件表达式,注意,条件表达式无需括号,包括各类循环,条件表达式都不需要括号,例如: for v in list { print v } 条件表达式的括弧是多余的,除非你需要显式地改变优先级,例如: if a && (b > c) { print 'ok' } 所以在BT语言中,推荐不使用括号,因为没有必要,虽然她是支持的,但我相信,哪怕你已经习惯了使用括号,当你使用BT语言时,你会慢慢发现,不使用括号是很爽的一件事。 这里我考虑到了花括号是否也要去掉,但是综合考虑之下,认为花括号是必须的,因为花括号可以避免不必要的错误,也使代码更加清晰,更加易读,这一点也是因为Python通过缩进来定义代码块的结构,而不是使用花括号,你必须要保持代码的缩进结构,对我来说这失去了灵活性和自由,所以深重考虑之下,保持花括号。语句结束符
BT中语句无需添加结束符分号,换行和空格都属于结束符,虽然是支持分号的,但不建议使用。 name = 'Lisa' age = 18 // 你也可以写成一行 name = 'Lisa' age = 18 // 也可以用逗号分割 name = 'Lisa', age = 18 // 来,我们用分号再看看 name = 'Lisa'; age = 18; 上面这种形式是BT都支持的,从我个人审美观来说,我更喜欢用空格或逗号来分割单行语句,此语法参考了python。变态的语法
BT语言中的语法是自由的,由于表达式都有返回值,所以导致她的语法可以支持这么用: a = false arr = [1, 2, 3, 4, 5, if a{ 10 }else{ 20 }] print arr // 打印:[1, 2, 3, 4, 5, 20] 你没看错,数组中写if ,还有,如果你高兴的话,Array数组也可以不用逗号分割,例如:
arr = [1 2 3 4 5]
只要你高兴就好,Object对象那就更灵活了:
obj = {
'title': '标题',
content: '内容'
views: if true{ 123 }else{ 456 }
}
可是使用逗号分割字段,可以不使用,Key可以加单引号,也可以不用,所以最好的方式是:
obj = {
title: 'hello'
content: '你好'
}
这难道不比任何编程语言的写法看着更舒服吗???实际上编译速度会更快。