# Clean

Clean és un llenguatge de programació funcional pur, de semàntica no estricta (avaluació tardana: les expressions s'avaluen només quan se'n demana el valor), desenvolupat a la universitat Radboud de Nimega, Països Baixos.

## Descripció

Clean és un dels llenguatges de programació funcional que més optimitza la velocitat i l'espai. Clean admet l'avaluació estricta (primerenca) ocasionalment per optimitzar l'execució, mitjançant anotacions específiques d'estrictesa (avaluació primerenca) i allotjament directe. Disposa de tipus d'unicitat per modelar els efectes laterals.
Els treballs en el llenguatge Clean van començar el 1984, com a part del projecte "parallel reduction machine". La primera versió es va posar en marxa el 1987
Va tenir una gran influència en Haskell, que més tard va influenciar Clean.

## Programa Hola Món

Avaluació d'expressions a partir de la funció principal Start
* anomenat mode consola
* Operació sobre fitxers (en aquest cas stdin, stdout)
* anomenat mode World
* amb clàusules where, caldrà individualitzar les variables que designen els diferents estats de l'entorn.
* mode World amb clàusules let-before d'avaluació tardana designades per '#'
* les clàusules let-before s'executen abans de l'encaix de patrons
* aquí són d'exec. tardana i constitueixen una seqüència similar als blocs monàdics del Haskell
* no caldrà individualitzar les variables que comporten estat (console, world) perquè els àmbits de visibilitat tapen els estats anteriors de les variables.

### A l'entorn Linux

Desempaquetar el paquet de codi nadiu, llegir README, i fer make, que instal·la al directori actual
dona la sortida

### A l'entorn Windows

Clean porta un entorn de desenvolupament IDE propi per a Windows no suportat inicialment per al Linux.
No porta instal·lador. Desempaquetes a la carpeta escollida i executes el CleanIDE.exe

## Característiques
### Sintaxi

blocs delimitats pel sagnat (marge esquerre de les línies d'instruccions)

#### Comentaris
### Tipus
#### Atributs: Unicitat en el tipus

Vegeu al manual el capítol Uniqueness typing.
Un tipus amb exigència d'unicitat (*Tipus) admet només referències úniques (una sola còpia) a estructures, a fi i efecte d'assegurar que no s'estigui accedint a l'estructura des d'un altre fil d'execució, i poder fer actualitzacions destructives in situ amb seguretat.

##### relació de subtipus en unicitat

    Passar una referència única a un paràmetre de funció que no requereixi unicitat és segur, però no a l'inrevés. Això estableix una relació de subtipus "únic subtipus de no-únic" que afavorirà que el compilador asseguri aquest aspecte estàticament, i que el manual representa així:

##### restriccions d'unicitat

    En una declaració de tipus de funció, es pot acompanyar els tipus amb variables d'atribut d'unicitat, i afegir com a restricció (exemple: "[w <= x, ...]"), les relacions de subtipus que cal que compleixin els atributs d'unicitat de les variables.

##### atribut d'unicitat anònim

    Per fer els tipus més llegibles podem obviar les variables d'atribut d'unicitat que no intervenen en les restriccions amb un punt indicant variable irrellevant, anomenada anònima
    Clean permet obviar les variables i restriccions derivables de les propietats de propagació. L'anterior declaració d'append es pot escriure:
    per fer-ho més llegible:

#### Altres atributs dels tipus

segons prefix amb els símbols '#', '!', sense i '|'

#### Enumeracions
### Expressions
#### Macros (:==)

Substitució de codi

#### (=:) a nivell global

Expressions constants (grafs en termes de Clean) a nivell global per a ser avaluades un sol cop.

#### (=>) a tots els nivells i (=) a nivell global

indica funció constant o en termes de Clean "regla de reescriure grafs" (ang.: rewrite rule)

#### Funcions

En termes de Clean les funcions són estratègies de reducció dels grafs.
polimòrfiques

#### definicions locals

estil declaratiu (ús abans de la definició, clàusula where)
, (~b - s)/d
estil imperatiu (definició abans de l'ús) amb àmbits successius (clàusula let ... in)
, (~b - s)/d

#### clàusules let-before

S'executen abans de l'encaix de patrons en les definicions de funcions. No permeten definir funcions internes.
Vegeu #Programa Hola Món més amunt.

#### funcions anònimes

ambdues formes valen

#### Excepcions

El manual no en parla.

#### Llista per comprensió
### Classes de tipus
#### exportant tipus

al fitxer d'interfície (.dcl) amb la clàusula definition module

### Mòduls
#### d'implementació

amb extensió ".icl"

#### d'interfície

amb extensió ".dcl"
Cal copiar-hi les declaracions de tipus de la implementació que vulguem exportar

### Biblioteques

Biblioteca estàndard i altres

### Eines

* Entorn de desenvolupament IDE

### extensions dels fitxers
#### .icl

    mòdul d'implementació

#### .dcl

    mòdul d'interfície (de definició d'especificacions exportades)

#### .abc

    codi intermedi (bytecode)

## Vegeu també

* Haskell

## Referències

* ↑ Universitat Radboud on es desenvolupa el lleng. Clean
* ↑ Debian.org - Banc de proves - Clean contra Haskell
* ↑ Preguntes freqüents sobre Clean
* ↑ StdBool
* ↑ StdInt
* ↑ StdReal
* ↑ StdChar
* ↑ StdTuple
* ↑ StdList
* ↑ StdArray
* ↑ Biblioteca estàndard i altres al menú esquerre Arxivat 2007-02-11 a Wayback Machine.(anglès)
* ↑ Entorn IDE del Clean Arxivat 2009-02-01 a Wayback Machine. (anglès)

## Enllaços externs

* Pàgina inicial del llenguatge Clean (anglès)
* Preguntes freqüents - Wiki del llenguatge (anglès)
* El "llibre de Clean" Arxivat 2009-10-07 a Wayback Machine. (anglès) Guia del llenguatge
* Manual de ref. "Language report" Arxivat 2009-01-30 a Wayback Machine.
* Clean a Linux Arxivat 2009-02-03 a Wayback Machine. (anglès)
Viccionari