Yin 希望能让程序员自然而然地表达他们的想法,它尝试解决如下问题:
- 大多数语言没能吸取历史教训
- 大多数语言受到宗教性的推崇,拥有一个过于狂热的社区,因此难以改正自己的错误
- 有些语言为程序员做得太少,有些语言为程序员做得太多
- 有些语言提供了太少的抽象,有些语言提供了太多的抽象
- 有些语言太不顾及可用性,游戏语言过于重视可用性而忽视了可用性之外的东西
- 有些语言从数学和逻辑那里学得太少,有些语言学得太多
- 有些语言太不顾及类型,有些语言对类型考虑过多
解决这些问题需要很多程序员的经验。因此 Yin 欢迎程序员贡献经验和观点,以便做出最好的决策。
状态
目前 Yin 语言处于设计阶段,很多设计上的决定已经做了,很多还没做。如果你希望学习如何设计和实现一门语言,那么 Yin 语言值得一看。
已实现的特性
- 基本类型(整型、浮点、数组、记录)
- 基本操作符(算术)
- 作为一等公民的函数(闭包)
- 类型系统(不完整,union type)
已实现的工具
- 解析器
- 解释器
- 类型检测
等待实现
- 测试框架
- 编译器
- 运行时环境
示例
数组
[1 2 3 4 5]
表达式
(* (+23) 4)
yin 语言采用了 lisp 所使用的基于 S 表达式的语法,这是因为作者认为 lisp 的基于 S 表达式的语法是最简单、最好看的语法:
- 避免“歧义”,无需记忆运算符优先级
- 基本算术操作和函数调用在语法上达成完美统一
- 前缀表达式和括号,更容易对齐,因而更美观
类型系统
(define fact
(fun ([x Int] [-> Int])
(if (= x 0) 1 (* x (fact (- x 1))))))
(fact5) -- 120
--
表示注释。
if 同样是函数,第一个参数是条件,第二个参数是条件成立时的表达式,第三个参数是条件不成立时的表达式。
函数采用如下格式:
(fun([x 输入类型] [-> 输出类型]) 函数体)
使用 define
绑定函数的名字。
交替递归
判断奇偶性的函数:
(define even
(fun ([x Int] [-> Bool])
(if (= x 0)
true
(if (= x 1)
false
(odd (- x 1))))))
(define odd
(fun ([x Int] [-> Bool])
(if (= x 0)
false
(if (= x 1)
true
(even (- x 1))))))
(even10) -- true
(even11) -- false
(odd10) -- false
(odd11) -- true
实现
Yin 最初使用 Typed Racket 实现,然而由于 Racket 系统报错信息的不精确,造成比较低的开发效率,因此后来换成了 Java。得益于简单的语法设计,Yin 的具有精确报错定位能力的解析器,实现只花了 2 小时,500 行 Java,且不依赖 Lex、Yacc 类工具。以后,Yin 语言将能够解释自己,从而能使用自身实现编译器,也就是自举。
许可
Yin 语言是开源的,使用 AGPLv3 许可。