LispKit Lisp
外观
| 编程范型 | 纯函数式 |
|---|---|
| 语言家族 | LISP |
| 設計者 | Peter Henderson |
| 发行时间 | 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。
绑定
[编辑]函数let和letrec有着类似的用处,但是在名字绑定机制即处理命名变量的方式上有着微妙的区别。
(let e (x₁.e₁) (x₂.e₂)……) ≡ ((lambda (x₁ x₂……) e) e₁ e₂……):let在声明列表中,将诸表达式的值绑定到诸变量名字。lambda定义并返回一个函数,在后续的函数应用之时,将诸实际参数表达式的值绑定到诸形式参数名字。(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₂……)。
引用
[编辑]- ^ Henderson, Peter. Functional Programming: Application and Implementation. Prentice Hall. 1980 [2021-12-28]. ISBN 0-13-331579-7. (原始内容存档于2021-12-28).
- ^ An implementation of the Lispkit described in the book "FUNCTIONAL PROGRAMMING: Application and Implementation", by Peter Henderson. [2021-12-28]. (原始内容存档于2021-12-30).
扩展阅读
[编辑]- Peter Henderson, Geraint A. Jones, and Simon B. Jones, "The LispKit Manual" (ISBN 0-902928-18-X)
外部链接
[编辑]- The LispKit Manual, Volume 1 (页面存档备份,存于互联网档案馆), Volume 2 (页面存档备份,存于互联网档案馆)
- Documentation and source of Lispkit
- Archive of old LispKit LISP code and files, plus C implementation of SECD machine
- Paper about a LispKit LISP implementation in Java (页面存档备份,存于互联网档案馆), and the implementation itself (页面存档备份,存于互联网档案馆)