LispKit Lisp

LispKit Lisp是词法作用域的纯函数式的Lisp语言子集,它是作为函数式编程概念的测试台而开发的。它率先使用了对惰性求值的早期经验。在1980年开发者Peter Henderson,出版了用一种变体ALGOL语言写的基于SECD机的实现。它的编译器和虚拟机都是高度可移植的,并已经在多种机器上实现。

基本函数
基本语言只提供了下列函数,但在Henderson的书中讨论了明确支持惰性求值和非确定性编程的扩展。
*(quote ):接受一个表达式,返回这个表达式为一个值。
*(eq ):接受二个表达式,如果它们的值相等,则返回符号T,否则返回符号F。
*(atom ):接受一个表达式,如果它的值是原子,则返回符号T,否则返回符号F。
*(if ):接受三个表达式,如果第一个表达式为符号T,则返回第二个表达式的值,否则返回第三个表达式的值。
*(cons ):接受二个表达式,返回由它们的值构成的一个值点对。
*(car ):也写为head,接受其值为点对的一个表达式,返回这个点对的第一个值。
*(cdr ):也写为tail,接受其值为点对的一个表达式,返回这个点对的第二个值。
*(let (.) (.)……):接受一个表达式和它所具有的一个声明类表,它包含在这个表达式中可见的诸命名表达式,这个函数返回这个表达式的值。
*(lambda ( ……) ):接受一个参数列表和一个表达式,将它们返回为函数。
*(letrec (.) (.)……):类似于let,但是在声明中被命名的表达式比如之中,出现的名字比如也代表着对应的值。
*(add ):接受二个表达式,返回它们的数值的和。
*(sub ):接受二个表达式,返回它们的数值的差。
*(mul ):接受二个表达式,返回它们的数值的积。
*(div ):接受二个表达式,返回它们的数值的商。
*(rem ):也写为mod,接受二个表达式,返回它们的数值的余数。
*(leq ):接受二个表达式,如果第一个数值小于或等于第二个,则返回符号T,否则返回符号F。

绑定
函数let和letrec有着类似的用处,但是在名字绑定机制即处理命名变量的方式上有着微妙的区别。
*:let在声明列表中,将诸表达式的值绑定到诸变量名字。lambda定义并返回一个函数,在后续的之时,将诸实际参数表达式的值绑定到诸形式参数名字。
*:letrec本质上类似于let,但是它允许递归的定义函数和值。
例如下面表达式的值是无限列表(1 1 1 ……):

(letrec i
(i.(cons (quote 1) i)))

上面例子采用点对表示法,指示出了对S-表达式的匹配方式,程序代码通常采用列表表示法写为:

(letrec e
(f lambda y₁ e₁)
(g lambda y₂ e₂))

这里的y是绑定变量的列表(x₁ x₂……)。

引用
扩展阅读
*Peter Henderson, Geraint A. Jones, and Simon B. Jones, "The LispKit Manual" (ISBN 0-902928-18-X)

外部链接

评论 (0)

  • 还没有评论,来抢沙发吧。