Claire

Absztrakt adattípusok

Modulok, absztrakt adattípusok

A modulok segítségével átláthatóbbá tehetjük a programjainkat, elkülöníthetjük egymástól a logikailag különböző programrészleteinket. A program modulokba rendezhető, s a modulokban lévő adatok, változók elretjhetők a többi modul elől.

A modul egy objektum, s egy névteret reprezentál, amely látható vagy rejtett más modulok számára. A Claire támogatja a többszörös névtereket, azaz egy UNIX féle fájlrendszerre hasonlító szerkezetet hozhatunk létre. Egy modulnak két fontos attríbútuma van: a part_of, amely a szülő modul nevét tartalmazza, illetve a uses, ami azoknak a moduloknak a listáját tartalmazza, amelyeket el akarok érni a modulon belül. Például:

interface :: module(part_of = library, uses = list(claire))

A példában az interface modul a library modul leszármazottja lesz, amely a claire modult használja (ez az összes modult jelenti, ugyanis minden modul név a claire névtérhez tartozik). Ha egy azonosítót létrehozunk, az ahhoz a modulhoz fog tartozni, amelyben létrehoztuk, alapértelmezésben a claire-hez.

A current_module() utasítás az éppen aktuális modullal tér vissza. Megváltoztatni egy új modulra a begin(module_name) utasítással lehet. Visszatérni pedig az end(module_name) utasítással. Például:

begin(interface) window <: object(...) end(interface)

A példában létrehoztuk az interface/window azonosítót. Minden azonosítót meg kell előznie a modul nevének, vagy pedig az éppen aktuális modulhoz illetve leszármazottjaihoz fog tartozni, kivéve persze ha private-nak deklaráltuk.

A láthatósági szabályok a következők:

Az azonosítót a private előtaggal deklarálhatjuk private-nak. Páldául:

begin(interface) claire/window <: object(...) private/temporary <: window(...) end(interface)

Ekkor a temporary azonosító private lesz, azaz nem lesz elérhető az interface modulon vagy a leszármazott moduljain kívűl.

Gyakori, hogy a modulokat fájlok halmazához akarjuk rendelni, azaz be akarjuk tölteni őket a modul névterébe. A Claire egy explicit reprezentációt biztosít számunkra, a made_of és a source attribútumok segítségével. A made_of(m) fájloknak a listája (sztringként leírva), amelyeket a modulhoz akarunk kötni, a source(m) pedig a közös könyvtár (ugyancsak sztringként megadva). A load/sload metódussal tölthetjük be automatikusan a helyes névtérbe a modul fájlait.