Whitepapers
15 items
15 items
The 1966 paper that introduced ISWIM, influenced ML/Haskell/JavaScript, and showed how all languages are variations on a common theme
Landin observed that the proliferation of programming languages (700+ by 1966) could be understood as syntactic variations on a small semantic core. He proposed ISWIM (If You See What I Mean)—not a language to implement, but a framework for understanding language design. ISWIM introduced concepts now fundamental to modern languages: let expressions, where clauses, offside rule (indentation-based syntax), and a clear separation between a language's "syntactic sugar" and its essential semantic core. This paper shaped the design of ML, Haskell, and influenced JavaScript's function expressions.
Most language differences are surface syntax, not deep semantics. Landin showed that diverse languages (ALGOL, LISP, Fortran) could be understood as different syntactic presentations of similar underlying ideas—applicative expressions evaluated in environments.
ISWIM is not one language but a template. Keep the core (expressions, functions, let/where) and vary the syntax. This insight directly led to the ML family of languages and influenced Haskell's design.
Landin introduced 'where' clauses for defining local bindings after use, and 'let' expressions for defining before use. Both are now standard in functional languages and even appear in JavaScript (let) and Python (walrus operator).
By 1966, over 700 programming languages had been designed. Each claimed novelty, yet most shared common concepts—variables, expressions, functions, conditionals. Landin asked: what if we could separate the essential semantics from the accidental syntax?
The insight: Most languages are the same language wearing different clothes. FORTRAN's `IF (X) 10, 20, 30` and ALGOL's `if x > 0 then ... else ...` express the same concept with different notation.
Landin's goal: Define a single semantic framework where any language could be understood as a particular syntactic mapping onto that framework. This would: