\begin{hcarentry}[new]{Clean}
\label{clean}
\participants{Software Technology Research Group at Radboud University Nijmegen}
\makeheader

Clean is a general purpose, state-of-the-art, pure and lazy functional programming language designed for making real-world applications.
Clean is the only functional language in the world which offers \emph{uniqueness typing}. This type system makes it possible in a pure functional language to incorporate destructive updates of arbitrary data structures (including arrays) and to make direct interfaces to the outside imperative world. %The type system makes it possible to develop efficient applications. 

%For people who are familiar with Haskell, 
Here is a short list with notable features:
\begin{itemize}
\item 
  Clean is a lazy, pure, higher-order functional programming language with explicit graph rewriting semantics. %; one can explicitly define the sharing of structures (cyclic structures as well) in the language.

\item
  Although Clean is by default a lazy language one can smoothly turn it into a strict language to obtain optimal time/space behavior: functions can be defined lazy as well as (partially) strict in their arguments; any (recursive) data structure can be defined lazy as well as (partially) strict in any of its arguments.

\item
  Clean is a strongly typed language based on an extension of the well-known Milner/Hindley/Mycroft type inferencing/checking scheme including the common higher-order types, polymorphic types, abstract types, algebraic types, synonym types, and existentially quantified types.

%\item
%  Due to the strong typing of Clean and the obligation to initialize all objects being created run-time errors can only occur in a very limited number of cases: when partial functions are called with arguments out of their domain (e.g., dividing by zero), when arrays are accessed with indices out-of-range and when not enough memory (either heap or stack space) is assigned to a Clean application.

\item
  Type classes and type constructor classes are provided to make overloaded use of functions and operators possible.

\item
  Clean offers %the following predefined types: integers, reals, Booleans, characters, strings, lists, tuples, 
  records and (destructively updateable) arrays and files.

\item
  Clean has pattern matching, guards, list comprehensions and array comprehensions and a lay-out sensitive mode.

%\item
%  One can define functions on a local level using where blocks, let expressions (even before a guard), and strict let expressions.

\item
%  Clean's key feature is a polymorphic uniqueness type inferencing system, a special extension of the Milner/Hindley/Mycroft type inferencing/checking system
  The uniqueness type system makes it possible to develop efficient applications. 
  In particular, it allows a refined control over the single threaded use of objects.
  Thus can influence the time and space behavior of programs.
  The uniqueness type system can be also used to incorporate destructive updates of objects within a pure functional framework.
  It allows destructive transformation of state information and enables efficient interfacing to the non-functional world (to C but also to I/O systems like X-Windows) offering direct access to file systems and operating systems.

%\item
%  Clean is a modular language allowing separate compilation of modules.
%  One defines implementation modules and definition modules.
%  There is a facility to implicitly and explicitly import definitions from other modules.

\item
  Clean offers a sophisticated I/O library with which window based interactive applications (and the handling of menus, dialogs, windows, mouse, keyboard, timers, and events raised by sub-applications) can be specified compactly and elegantly on a very high level of abstraction.

\item
  GUI-based programs written in Clean using the 0.8 I/O library can be ported without modification of source code to any one of the many platforms we support.

\item
  There are many libraries available offering additional functionality.
\end{itemize}
    
\FurtherReading
\url{http://clean.cs.ru.nl/}
\end{hcarentry}
