A Concurrent Clean 2.3 programozási nyelv

Nyelvi elemek

Megengedett karakterek

A nyelvben a 7 bites ASCII karakterek használhatók, a stringekben, karakterliterálokban ezen kívül a 8 bitesek is. A kis- és nagybetűket a fordító megkülönbözteti.

Elhatárolók

Elhatároló jelek a whitespace-ek, illetve a ;, {, } karakterek lehetnek, de nem akárhogyan! A Clean programokat kétféle módon is formázhatjuk:

Egy program indentált stílusban írva:

module indent // indent mode import StdEnv square:: Int -> Int square x = z where z = x * x Start:: Int Start = square 5

Ugyanaz nem indentált módban:

module nonindent; // nonindent mode import StdEnv; square:: Int -> Int; square x = z; where { z = x * x; } Start:: Int; Start = square 5;

Az eredmény természetesen mindkét esetben ugyanaz lesz:

$ indent -nt 25 $ nonindent -nt 25

Kommentek

// jelek után a sor végéig, vagy /* és */ jelek között több soron keresztül tartó megjegyzést írhatunk. A megjegyzések egymásba ágyazhatók. Külön dokumentációs megjegyzés nincs.

Azonosítók

Megkülönböztetünk kisbetűvel vagy nagybetűvel kezdődő azonosítókat (mindkettő folytatódhat kis- vagy nagybetűvel, számjeggyel vagy aláhúzással), illetve vicces azonosítókat, ez utóbbiak különféle írás- vagy operátorjelek kombinációi lehetnek. Ilyen jelek azonban nem keverhetők egy azonosítón belül betűkkel vagy számjegyekkel, ez lehetővé teszi, hogy az olyan kifejezéseket, mint az a+1 whitespace-ek nélkül írhassuk.

module identif // identifiers import StdEnv square:: Int -> Int square x = x * x @ :: Int -> Int @ x = x * x * x Start:: [Int] Start = [1 + square 5, 1+square 5, 1+square(5), 1 + @ 5, 1+ @5]

Az 1+square5 ill. az 1+@5 kifejezések viszont már fordítási hibát eredményeznének, mert a square5 függvényre ill. a +@ operátorra hivatkoznak.

A különféle változó- vagy mezőjellegű azonosítók kisbetűvel kezdődnek, a típusok és konstruktorok nevei nagybetűvel kezdődő vagy vicces azonosítók lehetnek; az összes többi azonosító bármilyen típusú lehet. Az azonosítókra vonatkozó hosszúsági megkötés nincs.

Vannak a teljes programszövegre, illetve csak bizonyos környezetekre (mint pl. függvénydefiníció, típusspecifikáció, stb.) lefoglalt szavak, illetve szimbólumok; ez utóbbiak a környezetükön kívül szabadon felhasználhatóak. Külön kulcsszó és előre definiált szó kategória nincs.

module keyword // scope of keywords import StdEnv square:: Int -> Int square x = Int where Int = x * x Start:: Int Start = square 5

Literálok

Az elemi típusoknak megfelelően egész, lebegőpontos, logikai és karakterértékeket, karakterek listáját, illetve karakterek dobozolatlan tömbjét (stringet) jelölhetünk literállal.

Az egész számokat előjeles decimális, oktális vagy hexadecimális formában írhatjuk le. A lebegőpontos számok tízes alapon, opcionális hatványkitevővel adhatók meg.

Logikai literál a True és a False. A karakterértékek aposztrófok között adhatók meg, a speciális jelek (úgymint vezérlőkarakterek, backslash, aposztróf, idézőjel) escape-elve, továbbá bármelyik karakter oktális vagy hexadecimális kódjával is leírható.

Ha aposztrófok közé több karaktert írunk, az karakterek listáját jelenti, míg az idézőjelek között felsorolt karakterek a stringet, azaz karakterek dobozolatlan tömbjét jelölik. Az eddigiekből következik, hogy a karakterlánc literálok többsorosak is lehetnek (az új sort a \n, \r megfelelő kombinációjával kell jelölni).

module literal // basic type literals import StdEnv Start:: (Int, Int, Int, Real, Real, Bool, Char, Char, [Char], String, String) Start = (-15, -017, -0xF, -0.002, -0.2E-2, True, '\"', '\x22', ['True'], "True", "Sad but\nTrue")

aminek az outputja:

$ literal -nt (-15,-15,-15,-0.002,-0.002,True,'"','"',['T','r','u','e'],"True","Sad but True")