Modulok és könyvtárak
A modulok és a könyvtárak tagolják a Dylan programot. A modulok reprezentálják a namespace-eket és vezérlik a hozáférést az objektumokhoz és a függvényekhez. A könyvtárak tartalmazzák a modulokat és a Dylan program fordítási egységei.
Egyszerű modulok
A modulok importálnak szimbólumokat más modulokból, és exportálnak szimbólumokat más modulok számára. A modulok közötti függőségnek irányított, körmentes gráfnak kell lennie. Két modul nem használhatja egymást, és nem lehetnek körbe függőségek.
A modulok csak változókat exportálhatnak. Minthogy az osztálynevek és a generikus függvények tárolódhatnak változókban, ez valójában nem megkötés.
A következő példa a vehilce osztály, és annak alosztályainak, valamint metódusainak a definíciója:
// === Vehilce osztály ===
define class vehicle (object)
slot serial-number :: integer,
required-init-keyword: sn:;
slot owner :: string,
init-keyword: owner:, // optional
init-value: "Northern Motors";
end class vehicle;
// === a vehilce osztály tax metódusa ===
define generic tax(v :: vehicle) => tax-in-dollars :: float;
define method tax(v :: vehicle) => tax-in-dollars :: float;
100.00;
end;
// === Két új alosztálya a vehicle-nak ===
define class car (vehicle)
end;
define class truck (vehicle)
slot capacity,
required-init-keyword: tons:;
end;
// === két új tax metódus ==
define method tax( c :: car ) => tax-in-dollars :: float;
50.00;
end method;
define method tax( t :: truck ) => tax-in-dollars :: float;
// standard vehicle tax plus $10/ton
next-method( ) + t.capacity * 10.00;
end method;
Most pedig egy egyszerű modul, ami a vehilce osztályt tartalmazza:
define module Vehicles
use Dylan;
export
,
serial-number,
owner, owner-setter,
tax,
,
,
capacity;
end module;
A normál modulokhoz hasonlóan, ez használja a Dylan modult, ami tartalmazza az összes standard beépített függvényt és osztályt. A Vehilce modul exportálja mind a három vehilce osztályt, a tax generikus függvényt, néhány lekérdező függvényt és egy beállító függvényt.
A slot-okhoz való hozzáférést az exportált lekérdező és beállító függvények szabályozzák. Ha egy slot-ot publikussá kívánunk tenni, mindkettőt exportálni kell. Csak olvashatóvát tételhez csak a lekérdező fügvényeket exportáljuk. Prívát láthatóság esetén pedig egyiket sem. A fenti példában a serial-number slot csak olvasható, míg az owner publikus.
Amikor néhány modul hozzáad egy metódust egy generikus függvényhez, a változás érinti az összes modult, amelyek használják azt a függvényt. Az új metódus tulajdonképpen hozzáadódik a generikus függvényt reprezentáló változóhoz. Ha ezt a változó korábban exportálva lett, minden kilens hozzáférhet az új értékhez.
Import lehetőségek
A Dylan nagyon precíz szabályozásra ad lehetőséget, hogy milyen szimbólumok lesznek importálva más modulokból. Például az egyedi szimbólumok importálhatóak a nevükkel. Bármikor átnevezhetőek, vagy egyszerre adható prefix egy modul összes szimbólumához. Néhány vagy az összes azonnal újraexportálható.
A Dylan importálási rendszere számos előnnyel bír. Ritkák a névütközések, a programozóknek nem szükséges függvény prototípusokat definiálnia. Nincs szükség külön header fájlokra. A modulok különböző hozzáféréseket biztosítanak ugyanahoz objektumhoz - az egyik modul exportálja a teljes hozzáférést, míg egy másik modul importálja, újradefiniálja és újraexportálja.
Könyvtárak
Könyvtárak modulokat tartalmaznak. Például a Dylan könyvtár tartalmazza a Dylan modult, az Extensions modult, és még néhány további implementáció függő modult. A könyvtár és a modul megoszthat egy adotto nevet. Hasonló névvel rendelkező modulok többnek látszanak mint egy könyvtár.
Alapértelmezésben a Dylan környezet biztosít egy Dylan-User nevű könyvtárat, a kényelmes programozáshoz. Ezt tipikusan a rövid, egy könyvtáras programok használják, amik csak a Dylan könyvtárban lévő modulokon alapszanak.
Továbbá minden modul tartalmaz egy implicit modult, mint a Dylan-User, ami importálja az összes modult a Dylan könyvtárból. Ez használható az egy modulos programokban.
A vehilce könyvtár például az alábbi módon definiálható a Dylan-User modulban:
define library Vehicles
use Dylan; // Ez a könyvtár!
export // Ezek a modulok.
Vehicles, // (lásd feljebb)
Traffic-Simulation,
Crash-Testing,
Inspection;
end library Vehicles;
Ez a könyvtár beimportálható egy másik könyvtárba:
define library Vehicle-Application
use Dylan;
use My-GUI-Classes;
use Vehicles;
end;
Könyvtárak importálhatnak más könyvtárakat, és exportálhatnak modulokat, míg a modulok importálhatnak más modulokat és exportálhatnak változókat. Általában a modulok bármely modult importálhatják a szülő könyvtárukból, vagy ami exportálva lett egy könyvtárból, amelyet a szülő könyvtár importált. A következő modul például a Vehicle-Application könyvtárba tartozik.
define module Sample-Module
// modul név forrás könyvtár
use Dylan; // Dylan
use Extensions; // Dylan
use Menus; // My-GUI-Classes
use Vehicles; // Vehicles
use Inspection; // Vehicles
end module;