跳转到内容

LispKit Lisp

维基百科,自由的百科全书
Lispkit Lisp
编程范型纯函数式
语言家族LISP
设计者Peter Henderson
发行时间1980年,​45年前​(1980
作用域词法
实作语言ALGOL, Pascal, C
受影响于
ALGOL, LISP

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

基本函数

[编辑]

基本语言只提供了下列函数,但在Henderson的书中讨论了明确支持惰性求值非确定性编程的扩展。

  • (quote <exp>):接受一个表达式,返回这个表达式为一个值。
  • (eq <exp1> <exp2>):接受二个表达式,如果它们的值相等,则返回符号T,否则返回符号F
  • (atom <exp>):接受一个表达式,如果它的值是原子,则返回符号T,否则返回符号F
  • (if <exp1> <exp2> <exp3>):接受三个表达式,如果第一个表达式为符号T,则返回第二个表达式的值,否则返回第三个表达式的值。
  • (cons <exp1> <exp2>):接受二个表达式,返回由它们的值构成的一个值点对。
  • (car <exp>):也写为head,接受其值为点对的一个表达式,返回这个点对的第一个值。
  • (cdr <exp>):也写为tail,接受其值为点对的一个表达式,返回这个点对的第二个值。
  • (let <exp> (<name1>.<exp1>) (<name2>.<exp2>)……):接受一个表达式和它所具有的一个声明类表,它包含在这个表达式中可见的诸命名表达式,这个函数返回这个表达式的值。
  • (lambda (<name1> <name2>……) <exp>):接受一个参数列表和一个表达式,将它们返回为函数。
  • (letrec <exp> (<name1>.<exp1>) (<name2>.<exp2>)……):类似于let,但是在声明中被命名的表达式比如<exp1>之中,出现的名字比如<name1>也代表着对应的值。
  • (add <exp1> <exp2>):接受二个表达式,返回它们的数值的和。
  • (sub <exp1> <exp2>):接受二个表达式,返回它们的数值的差。
  • (mul <exp1> <exp2>):接受二个表达式,返回它们的数值的积。
  • (div <exp1> <exp2>):接受二个表达式,返回它们的数值的商。
  • (rem <exp1> <exp2>):也写为mod,接受二个表达式,返回它们的数值的余数。
  • (leq <exp1> <exp2>):接受二个表达式,如果第一个数值小于或等于第二个,则返回符号T,否则返回符号F

绑定

[编辑]

函数letletrec有着类似的用处,但是在名字绑定机制即处理命名变量的方式上有着微妙的区别。

  • (let e (x₁.e₁) (x₂.e₂)……) ((lambda (x₁ x₂……) e) e₁ e₂……)let在声明列表中,将诸表达式的值绑定到诸变量名字。lambda定义并返回一个函数,在后续的函数应用英语Function application之时,将诸实际参数表达式的值绑定到诸形式参数名字。
  • (letrec e (x₁.e₁) (x₂.y₂)……)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)

外部链接

[编辑]