A Concurrent Clean 2.3 programozási nyelv

Adattípusok, változók, kifejezések

A Clean szigorúan típusos nyelv, minden gráfbeli pontnak (kifejezésnek) és minden gráfújraírási szabálynak (függvénynek) van típusa. A típusok megadása nem kötelező a programszövegben, de mivel a nyelv szigorúan, statikusan típusos nyelv, ezért megköveteli, hogy minden részkifejezésnek fordítási időben pontosan meghatározott legáltalánosabb típusa legyen. Ha a programozó nem adja meg a típust, akkor a Hindley-Milner féle korlátozottan polimorfikus típusrendszer alapján a fordító a típuslevezetési szabályok által meghatározza. Nyelvi eszközök az absztrakt és algebrai adattípusok leírásához is biztosítottak. (lsd. Új típusok definiálása)

Az előző példa típusmegadás nélküli változata:

module typeinf // type inference possibility Start = (-15, -017, -0xF, -0.002, -0.2E-2, True, '\"', '\x22', ['True'], "True", "Sad but\nTrue")

Ez is lefordul, sőt a -lt kapcsolóval megkérhetjük a Clean fordítót, hogy írja ki a kikövetkeztetett típusokat:

$ clm -lt typeinf -o typeinf Compiling typeinf Start :: (.Int,.Int,.Int,.Real,.Real,.Bool,.Char,.Char,[.Char],{#Char},{#Char}); Generating code for typeinf Linking typeinf $ typeinf -nt (-15,-15,-15,-0.002,-0.002,True,'"','"',['T','r','u','e'],"True","Sad but True")

A leggyakoribb hiba a típushiba. Egyesek szerint a funkcionális nyelvek esetén minden hiba ilyen jellegű. A fordító ilyen esetekben rögtön figyelmeztet bennünket (Cleanide-del fordítva Windows alól):

module typeError import StdEnv Start = 1.0 + 0
Type error [typeError.icl,4,Start]:"argument 1 of +" cannot unify types: Real Int

Előre definiált típusok

Elemi Típusok

Hatékonysági és kényelmi okokból egész és lebegőpontos szám, karakter illetve logikai típust biztosít a rendszer — egyébként ezeket az általános algebrai típus definiálásának lehetőségét kihasználva mi magunk is létrehozhatnánk. Mindegyikből egyfajta, rögzített méretű létezik: az egészek 32, a lebegőpontosak 64, a karakter és logikai típusok 8 bitesek. A szokásos aritmetikai operátorok túlterhelési technika segítségével ugyanazon nevekkel elérhető módon vannak definiálva az egész és a lebegőpontos típusokra.

Mutató típus nincs, de a nyelv logikája alapján ennek nem is lenne értelme.

Listák

A listában tetszőleges számú, tetszőleges típusú elemet tárolhatunk, de valamennyi elemnek azonos típusúnak kell lennie. Az üres lista konstruktora [].

Listák létrehozása kétféle módon történhet: