52 Chapter 2 Evolution of the Major Programming Languages
Recognizing the flexibility provided by dynamic scoping as well as the
simplicity of static scoping, Common LISP allows both. The default scoping
for variables is static, but by declaring a variable to be special, that variable
becomes dynamically scoped.
Common LISP has a large number of data types and structures, including
records, arrays, complex numbers, and character strings. It also has a form of
packages for modularizing collections of functions and data providing access
control.
Common LISP is further described in Chapter 15.
2.4.6 Related Languages
ML (MetaLanguage; Ullman, 1998) was originally designed in the 1980s by
Robin Milner at the University of Edinburgh as a metalanguage for a program
verification system named Logic for Computable Functions (LCF; Milner et
al., 1990). ML is primarily a functional language, but it also supports impera-
tive programming. Unlike LISP and Scheme, the type of every variable and
expression in ML can be determined at compile time. Types are associated with
objects rather than names. Types of names and expressions are inferred from
their context.
Unlike LISP and Scheme, ML does not use the parenthesized functional
syntax that originated with lambda expressions. Rather, the syntax of ML
resembles that of the imperative languages, such as Java and C++.
Miranda was developed by David Turner (1986) at the University of Kent
in Canterbury, England, in the early 1980s. Miranda is based partly on the
languages ML, SASL, and KRC. Haskell (Hudak and Fasel, 1992) is based in
large part on Miranda. Like Miranda, it is a purely functional language, having
no variables and no assignment statement. Another distinguishing character-
istic of Haskell is its use of lazy evaluation. This means that no expression is
evaluated until its value is required. This leads to some surprising capabilities
in the language.
Caml (Cousineau et al., 1998) and its dialect that supports object-oriented
programming, OCaml (Smith, 2006), descended from ML and Haskell. Finally,
F# is a relatively new typed language based directly on OCaml. F# (Syme et al.,
2010) is a .NET language with direct access to the whole .NET library. Being a
.NET language also means it can smoothly interoperate with any other .NET
language. F# supports both functional programming and procedural program-
ming. It also fully supports object-oriented programming.
ML, Haskell, and F# are further discussed in Chapter 15.
2.5 The First Step Toward Sophistication: ALGOL 60
ALGOL 60 has had much influence on subsequent programming languages
and is therefore of central importance in any historical study of languages.