LispKit Lisp
LispKit Lisp是Lisp语言的严格函数式子集(“纯Lisp”),它是作为函数式编程概念的测试台而开发的。它首先使用了对惰性求值的早期经验。在1980年开发者Peter Henderson,出版了用一种变体ALGOL语言写的基于SECD抽象机的实现[1]。编译器和虚拟机都是高度可移植的,并已经在多种机器上实现[2]。
基本函数
基本语言只提供了下列函数,但在Henderson的书中讨论了明确支持惰性求值和非确定性编程的扩展。
- atom
- 接受一个表达式,如果它的值是原子则返回 True;否则返回 False。
- add
- 接受两个表达式,返回它们的数值的和。
- car
- 接受其值为点对的一个表达式,返回这个点对的第一个值。
- cdr
- 接受其值为点对的一个表达式,返回这个点对的第二个值。
- cons
- 接受两个表达式,返回由它们的值构成的一个点对值。
- div
- 接受两个表达式,返回它们的数值的商。
- eq
- 接受两个表达式,如果它们的值相等则返回 True;否则返回 False。
- if
- 接受三个表达式,如果第一个为 True 则返回第二个的值,否则返回第三个的值。
- lambda
- 接受一个表达式,返回这个表达式为可求值的值。
- let
- 接受命名表达式的一个列表,返回这个列表为一个单一可求值的值。
- letrec
- 接受命名表达式的一个列表,返回这个列表为一个单一可求值的值。
- leq
- 接受两个表达式,如果第一个数值小于或等于第二个则返回 True;否则返回 False。
- rem
- 接受两个表达式,返回它们的数值的余数。
- mu
- 接受两个表达式,返回它们的数值的积。
- quote
- 接受一个表达式,返回这个表达式为一个值。
- sub
- 接受两个表达式,返回它们的数值的差。
函数lambda、let和letrec是类似的,但是在处理命名变量的方式上有着微妙的区别,故有不同的用处。lambda定义并返回一个函数,let把表达式赋值给变量名,而letrec本质上类似于let,除了它允许递归函数的定义之外。
引用
- ^ 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 (页面存档备份,存于互联网档案馆)
- Implementation of Lispkit (页面存档备份,存于互联网档案馆)
- GNU Pascal LispKit port (页面存档备份,存于互联网档案馆)
- 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 (页面存档备份,存于互联网档案馆)