iScheme 使用 list 关键字定义列表,并提供 first 关键字获取列表的第一个元素;提供 rest 关键字获取列表除第一个元素外的元素。
iScheme的列表示例
>> (define alist (list 1 2 3 4))
>> (list 1 2 3 4)
>> (first alist)
>> 1
>> (rest alist)
>> (2 3 4)
定义函数定义函数
iScheme 使用 func 关键字定义函数:
iScheme的函数定义
(def square (func (x) (* x x)))
(def sum_square (func (a b) (+ (square a) (square b))))
对应的C#代码
public static int Square (int x) {
return x * x;
}
public static int SumSquare(int a, int b) {
return Square(a) + Square(b);
}
递归递归
由于 iScheme 中没有 for 或 while 这种命令式语言(Imperative Programming Language)的循环结构,递归成了重复操作的唯一选择。
以计算最大公约数为例:
iScheme计算最大公约数
(def gcd (func (a b)
(if (= b 0)
a
(func (b (% a b))))))
对应的C#代码
public static int GCD (int a, int b) {
if (b == 0) {
return a;
} else {
return GCD(b, a % b);
}
}
高阶函数高阶函数
和 Scheme 一样,函数在 iScheme 中是头等对象,这意味着:
可以定义一个变量为函数。
函数可以接受一个函数作为参数。
函数返回一个函数。
iScheme 的高阶函数示例
; Defines a multiply function.
(def mul (func (a b) (* a b)))
; Defines a list map function.
(def map (func (f alist)
(if (empty? alist)
(list )
(append (list (f (first alist))) (map f (rest alist)))
)))
; Doubles a list using map and mul.
>> (map (mul 2) (list 1 2 3))
>> (list 2 4 6)
小结小结
对 iScheme 的介绍就到这里——事实上这就是 iScheme 的所有元素,会不会太简单了? -_-
接下来进入正题——从头开始构造 iScheme 的解释程序。
解释器构造解释器构造
iScheme 解释器主要分为两部分,解析(Parse)和求值(Evaluation):
1、解析(Parse):解析源程序,并生成解释器可以理解的中间(Intermediate)结构。这部分包含词法分析,语法分析,语义分析,生成语
法树。
2、求值(Evaluation):执行解析阶段得到的中介结构然后得到运行结果。这部分包含作用域,类型系统设计和语法树遍历。
词法分析词法分析