Lispkit Lisp
{{Multiple issues|
{{Notability|date=June 2018}}
{{Primary sources|date=June 2018}}
}}
{{Infobox programming language
| name = Lispkit Lisp
| screenshot =
| screenshot caption =
| sampleCode =
| paradigm =pure functional
| family = Lisp
| designer = Peter Henderson
| developer =
| released = {{Start date and age|1980}}
| latest release version =
| latest release date = {{Start date and age|1983}}
| typing =
| memory management =
| scope = lexical
| programming language = ALGOL
| discontinued = Yes
| platform =
| operating system =
| license =
| file ext =
| file format =
| website =
| implementations =
| dialects =
| influenced =
}}
Lispkit Lisp is a lexically scoped, purely functional subset of Lisp (Pure Lisp) developed as a testbed for functional programming concepts. It was first used for early experimentation with lazy evaluation. An implementation based on a stack, environment, control, dump virtual machine and abstract machine (SECD machine) written in an ALGOL variant was published by the developer Peter Henderson in 1980.{{cite book |last1=Henderson |first1=Peter |year=1980 |title=Functional Programming: Application and Implementation |publisher=Prentice Hall |isbn=0-13-331579-7}} The compiler and virtual machine are highly portable and as a result have been implemented on many machines.
{{cite web |last1=McJones |first1=Paul |date=12 May 2014 |title=Original OUCL PRG LispKit |website=Computer History Museum: Software Preservation Group |publisher=University of Oxford |publication-place=Mountain View, California |url=https://www.softwarepreservation.org/projects/LISP/lispkit/LispKit.tar.gz/view |via=Plone Foundation}}
{{cite web |last1=McJones |first1=Paul |date=12 May 2014 |title=Aaron Gray's port of LispKit to GNU Pascal |website=Computer History Museum: Software Preservation Group |publisher=Cybercomms.org |publication-place=Mountain View, California |url=https://www.softwarepreservation.org/projects/LISP/lispkit/LispKit-GNU_Pascal.tar.gz/view |via=Plone Foundation}}
Base language
The base language provides the following functions only but extensions are discussed in Henderson's book for the explicit support of lazy evaluation and nondeterministic programming.
:atom
– given an expression returns True if its value is atomic; False if not
:add
– given two expressions returns the sum of their numeric values
:car
– given an expression whose value is a pair, returns the pair's first value
:cdr
– given an expression whose value is a pair, returns the pair's second value
:cons
– given two expressions returns a value pair consisting of their values
:div
– given two expressions returns the quotient of their numeric values
:eq
– given two expressions returns True if their values are equal; False if not
:if
– given three expressions returns the value of the second if the value of the first is True, otherwise returns the value of the third
:lambda
– given an argument list and an expression, returns them as a function
:let
– given an expression with declarations (as named expressions visible in the expression) returns its value
:letrec
– like let, except the declared names are also visible in the declarations themselves
:leq
– given two expressions, returns True if the value of the first is numerically less than or equal to the value of the second; False if not
:mod
(or rem
) – given two expressions, returns the modulus (also known as the remainder) of their numeric values
:mul
– given two expressions, returns the product of their numeric values
:quote
– given an expression, returns that expression as a value
:sub
– given two expressions, returns the difference of their numeric values
The functions, lambda
, let
, and letrec
, are similar but have subtle differences in the way that they treat named variables which make them useful in different ways: lambda
defines and returns a function, let
binds expressions to variable names, and letrec
is essentially similar to let
except it allows defining of recursive functions and values, e.g., infinite series.
References
{{Reflist}}
Further reading
- {{cite book |last1=Henderson |first1=Peter |last2=Jones |first2=Geraint A. |last3=Jones |first3=Simon B. |date=1 December 1983 |title=The LispKit Manual |publisher=University of Oxford Computing Laboratory |isbn=978-0902928183}}
- {{cite book |last1=Henderson |first1=Peter |last2=Jones |first2=Geraint A. |last3=Jones |first3=Simon B. |date=1 December 1983 |url=http://www.cs.ox.ac.uk/files/3299/PRG32%20vol%201.pdf |title=The LispKit Manual: Volume 1 |publication-place=Oxford, England |publisher=University of Oxford: Computing Laboratory: Programming Research Group}}
- {{cite book |last1=Henderson |first1=Peter |last2=Jones |first2=Geraint A. |last3=Jones |first3=Simon B. |date=1 December 1983 |url=http://www.cs.ox.ac.uk/files/3300/PRG32%20vol%202.pdf |title=The LispKit Manual: Volume 2 |publication-place=Oxford, England |publisher=University of Oxford: Computing Laboratory: Programming Research Group}}
External links
- [https://github.com/hanshuebner/secd/tree/master/lispkit/LKIT-2 Archive of old LispKit Lisp code and files, plus C implementation of SECD machine]
- [http://perun.pmf.uns.ac.rs/radovanovic/publications/2002-prim-lisp.pdf Paper about a LispKit Lisp implementation in Java], and [https://perun.pmf.uns.ac.rs/radovanovic/downloads.htm the implementation]
{{Lisp programming language}}