在设计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(',')
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: '你好'
}
这难道不比任何编程语言的写法看着更舒服吗???实际上编译速度会更快。