Escher (programming language)
title: "Escher (programming language)" type: doc version: 1 created: 2026-02-28 author: "Wikipedia contributors" status: active scope: public tags: ["functional-languages"] topic_path: "technology/programming-languages" source: "https://en.wikipedia.org/wiki/Escher_(programming_language)" license: "CC BY-SA 4.0" wikipedia_page_id: 0 wikipedia_revision_id: 0
::data[format=table title="Infobox programming language"]
| Field | Value |
|---|---|
| name | Escher |
| paradigm | declarative: functional, logic |
| year | mid-1990s |
| designer | J.W. Lloyd |
| latest_release_version | |
| typing | static, manifest |
| implementations | Kee Siong Ng's implementation |
| influenced_by | simple theory of types |
| :: |
| name = Escher | logo = | paradigm = declarative: functional, logic | year = mid-1990s | designer = J.W. Lloyd | developer = | latest_release_version = | latest release date = | typing = static, manifest | implementations = Kee Siong Ng's implementation | influenced_by = simple theory of types | influenced = | operating_system = | license = | website = | file_ext = Escher (named for M. C. Escher, "a master of endless loops") is a declarative programming language that supports both functional programming and logic programming models, developed by J.W. Lloyd in the mid-1990s. It was designed mostly as a research and teaching vehicle. The basic view of programming exhibited by Escher and related languages is that a program is a representation of a theory in some logic framework, and the program's execution (computation) is a deduction from the theory. The logic framework for Escher is Alonzo Church's simple theory of types.
Escher, notably, supports I/O through a monadic type representing the 'outside world', in the style of Haskell. One of the goals of Escher's designers was to support meta-programming, and so the language has comprehensive support for generating and transforming programs.
Examples
::code[lang=text] MODULE Lambda. CONSTRUCT Person/0. FUNCTION Jane, Mary, John: One -> Person.
FUNCTION Mother : Person * Person -> Boolean. Mother(x,y) => x=Jane & y=Mary.
FUNCTION Wife : Person * Person -> Boolean. Wife(x,y) => x=John & y=Jane.
FUNCTION PrimitiveRel : (Person * Person -> Boolean) -> Boolean. PrimitiveRel(r) => r=Mother / r=Wife.
FUNCTION Rel : (Person * Person -> Boolean) -> Boolean. Rel(r) => PrimitiveRel(r) / (SOME [r1,r2] (r = LAMBDA [u] (SOME [z] (r1(Fst(u),z) & r2(z,Snd(u)))) & PrimitiveRel(r1) & PrimitiveRel(r2))). ::
References
- Declarative programming in Escher, JW Lloyd, University of Bristol, Bristol, UK, 1995
- An implementation of Escher (Some dead links can be reached from the archived page (or by substituting the new domain in the link in question).)
::callout[type=info title="Wikipedia Source"] This article was imported from Wikipedia and is available under the Creative Commons Attribution-ShareAlike 4.0 License. Content has been adapted to SurfDoc format. Original contributors can be found on the article history page. ::