Cool语言是一个面向对象的语言。虽然比较小型,但也包含了许多现代语言的特性,如对象、强类型和自动化内存管理。如果你之前熟悉c++、java等面向对象语言,那么会很容易上手。
学一门新语言,最急迫想知道的就是,如何编写“hello world”程序,下面就来尝个鲜。
class Main inherits IO {
main(): SELF_TYPE {
out_string("Hello, World.\n")
};
};
打眼一看,外形很像java,其实意思也很相近了。下面我来细细详谈。全文大部分翻译cool语言手册。
1,类结构 classes
一个Cool程序是由许多的类组成,每个类的定义必须在一个源文件里。但是多个类可以定义在一个源文件中。类的形式:
class <type> [ inherits <type> ] {
<feature_list>
};
<type>代表类名,[]里的内容是可选项。{}内是feature集合。所有类名都是全局可见的。类名是以大写字母开头的字符串。类不能重复定义(不能有两个类名字相同)。
“hello world”例子,就只有一个类,名字是Main。
2,features
feature也就是我们说的函数和属性的统称。一个类是由数个features组成。
2.1 函数 methods
函数结构如下:
<id> ( <id> : <type> , ... , <id> : <type>) : <type> { <expr> }
<id>是标示符,也就是名字。<type>是类型。<expr>是表达式。()里面是函数的形参定义。例如:
add ( a : Int, b : Int ) : Int {
a + b
}
add是函数名,a和b是参数名字,":"后跟着的是参数的类型。") :"后跟着的是返回类型。{}里面就是函数内容,也就是表达式组成。表达式后面会讲到。
类函数是外部可见的,也就是外部可以调用类的任何函数。
函数参数可以有1个或更多,也可以没有,并且参数的名字不能相同。函数的返回值必须明确给出。如果参数的名字和类属性名字相同,那么就会隐藏掉类属性。也就是说在这个函数里,参数和类属性名字相同,那么同名用的都是参数。
2.2 属性 attributes
属性结构如下:
<id> : <type> [ <- <expr> ];
<id>是属性名,<type>是属性类型。[]是可选的,属性的初始化。也就是把<expr>表达式的值赋给<id>。例如:
class A {
x : Int <- 1;
}
类A有一个属性为Int型的x,初始化为1。
初始化操作是在新建立一个类的对象的时候进行。在一个类内,属性初始化的顺序就是定义的顺序。类属性是局部变量,是类私有的。外部不能直接访问类的属性,只能通过函数去修改值。这也体现了现代OO语言的封装性。
所有的属性,如果没有指定初始化,那么默认初始为void。void类似于c语言里面的NULL,或者java里的null。不过在Cool语言里没有void的定义。唯一一个创建void值得方法就是在某个类里建立一个变量,除了Int,String,Bool类,并让这个void初始化,或者保存while循环的结果。有一个表达式isvoid expr,用来判断expr的值是不是void(会在之后表达式里讲到)。
基础类Int,Bool和String的属性定义和初始化是特殊的,会在后面基础类里讲到。