Lain:最小的Lisp

2021-02-10 03:18:11

莱恩语是Rinin(实验图形终端)中使用的一种口齿不清的方言。本指南介绍了Lain语言。 Lain默认情况下没有标准库,因此,如果不将某些基本操作定义为运行时环境的一部分,那么许多基本操作就无法完成。但是,这也为使用Lainto包含适合其任务的标准库函数的任何程序提供了灵活性。

lisp和此Lain的主要特征是它的语法基于s表达式。 S-表达式的特点是大量使用括号,并表示数据或代码。一个s表达式可以是原子,也可以是另一个s表达式。这为我们提供了一个程序,其中通常将逻辑深化。

原子的示例是无法进一步细分的值或名称。例如:10,姓名和" Hello World"被认为是原子。然后可以通过将多个原子一起括起来将原子构造成列表,例如(1 2 3 4)和(" a"" b"" c"),值列表。但是,在Lain内部,列表也可以表示函数调用,其中列表的第一项是函数名称,后跟所有函数的参数。

列表是Lain的核心,在大多数情况下,用括号括起来的任何内容都将被视为列表。这两个例外是列表的第一项是函数名称或关键字时。

遇到函数名称时,将使用其余列表项作为函数的参数来评估函数。

遇到关键字时,其余列表项将根据关键字的预定义行为进行处理。在某些情况下,后续列表项将以特定顺序出现,或通过为关键字定义的规则进行评估。在下面定义了以下行为:def,defn,λ,let,if和属性访问器。

变量的值可以是函数的原语,列表或结果。

;;基本值:(def游戏名" pong")(def球速100)(def摩擦0.1)(def game-over false);清单:(def等级(1 2 3));;函数调用的结果:(def玩家位置(位置0 0))(def难度(双精度1))

;返回第一个参数(定义身份(值)的值);将第一个参数包装在列表中(defn short-list(值)(值));将两个参数包装在一个列表中(defn对(a b)(a b));获取列表的第一个元素(defn first(xs)(:0 xs));获取列表的第二个元素(defn second(xs)(:1 xs))

Lambda函数是没有名称的函数...当函数希望将函数作为参数使用时,这很有用,但是我们更喜欢按行定义函数。

;身份λ函数(λ(value)value);将第一个参数包装在列表中(λ(值)(值));将两个参数包装在一个列表中(λ(a b)(a b))

Lambda函数也可以与变量定义结合使用以为其命名。

虽然这种情况不太常见,但有时这样做可能很方便。

let是一个关键字,它允许我们将多个值绑定为单个表达式。当需要计算中间值时,这在函数体内最为有用。

该语法包括3个部分,let关键字,后跟绑定的键值对列表,最后是return atom或s-expression。 ; 将值绑定到x和y,使用它们来计算总数; 总计返回(let(((x 1)(y 2)(total(add x y)))total) if是另一个关键字,它允许我们在满足条件的情况下有条件地评估doubles表达式之一。 语法分为4部分。 if关键字,一个值为true或false的表达式,为true时要评估的表达式以及为false时要被评估的表达式。