15.1.1 从符号组合出动画
除其他外,LISP 语言以其简单但功能强大的语法闻名。当写任何复杂的程序时,你总是最终定义自己的基元,然后指定它们的意思。下面的示例演示如何能定义一个简单的动画,使用 LISP 的语法。该代码创建两个移动的盘子:一个绿色,直径为 50 ,一个小一点,红色, 直径 20。绿色的围绕点 (0,0)以 100 像素的半径旋转,红色在两个指定点之间移动:
(compose
(disc 50 green (rotating 0 0 100))
(disc 20 red (linear -100 0 100 0))
)
在 LISP,一切既可以是符号,也可以是列表。在前面的代码段中,所有的标识符(例如,compose 或 red),以及数字常量都是符号。列表使用括号创建,所以,代码 (rotating 0 0 100 2) 构造一个包含五种元素的列表,其中的每一个都是符号。列表可以由基元符号组成,也可以包含嵌套的列表。在我们示例的顶层,由符号 compose 和两个嵌套的列表组成。
如果我们看一下出现在代码段中的符号,我们可以确定几个基元。例如,disc 用于创建一个可见的形状,而我们有两个基元 (rotating 和 linear)来指定基元形状的运动。然后,我们有一个符号 compose,从其他形状构建一个动画对象。这就是基元组合操作的示例:我们可以用与使用其他形状完全相同的方式,使用这个结果。我们可以指定整个组合动画的运动,就像操作为单个形状一样容易。
从语法的角度看,前面的示例创建了包含一个符号和其他两个列表的列表,因此,很自然会问,我们如何指定代码实际的意义呢。