目录
- 用javascript实现一门编程语言-前言
- 用javascript实现一门编程语言-语言构想
- 用javascript实现一门编程语言-写一个解析器
- 用javascript实现一门编程语言-字符输入流
关于 λanguage 的一些构想
对,我们要实现的语言就叫它
λanguage吧。
正确的编程方式,是应该先有明确的思路和逻辑。所以我们应该把 λanguage 的语言特性罗列到这里,但是在这个教程中,我就较为随意的放几个例子来解释语言特性吧。
# 这里是注释
println("Hello world");
println(2 + 3 * 4);
# 通过 lambda 这个关键字来声明函数
fib = lambda (n) if n < 2 then n else fib(n - 1) + fib(n - 2);
println(fib(15))
print-range = λ(a, b)
if a <= b then {
print(a);
if a + 1 <= b {
print(", ");
print-range(a + 1, b);
} else println("");
}
print-range(1, 5);
你应该注意到上面的变量名称包含
-号,这是根据个人偏好来设定的,因为作者不喜欢使用驼峰命名,也不喜欢使用下划线。自己实现一个编程语言的好处就是,你可以自定义它的语法。
上面代码的输出如下:
Hello world
14
610
1, 2, 3, 4, 5
λanluage 可能看起来跟 javascript 很像,但是它们是不一样的。
λanguage是不需要声明变量的,只有表达式- 一个表达式的返回值可以用在其他表达式中
- 分号用来分割语句
- 用花括号来创建一个块,返回值是最后一条语句的值,花括号也是一种表达式
以下的程序是合法的:
a = {
fib(10); # 没有任何副作用,但是还是会执行
fib(15) # 最后一个分号可以省略
};
print(a); # 打印出 610
函数是通过 lambda 或者 λ 来声明。在关键字的后面需要跟被括号包裹的形式参数,如
fib = lambda(num) num + 1;
关键字后面是单句表达式,但是可以通过{}来生成一个代码块。表达式的最后一个语句的执行结果会作为返回值传给调用者。
注意没有var, 你可以通过类似javascript中的立即执行函数 (IIFE) ,来声明一个变量。可以通过 lambda 声明一个变量作为参数。 变量是术语块级作用域。函数类似于javascript中的闭包。
javascript 中的三元表达式可以写成这样:
a = foo() ? bar() : baz(); // javascript
a = if foo() then bar() else baz(); # λanguage
在有{ 的情况下 then 关键字可以被省略,如上面的print-range。其他的都是必须的,通过else创建另一个条件分支。当表达式中 else 缺失,并且if判断为false时,if表达式将会返回 false。语言中除了false以外,都会被解析成true,包括数字0和空字符串。
注意,我们需要在每一个表达式后面用分号;作为结束。
好了,这就是关于我们λanguage语言的介绍,虽然它看起来像个玩具,并且缺少很多特性,如数组、对象等,但是都是在这些的基础上展开的,如果你能很好的理解掌握我们的教程,其他的语法特性都不是问题。