Személyes eszközök
Keresés

 

A InfoWiki wikiből


Tartalomjegyzék

Típusrendszer

A TITAN-M típusrendszere tartalmaz valahány alaptípust, mely nyelvi szinten támogatott. Ezekből képezhetünk típus-konstruktorok segítségével rekord, touple, tömb, lista típusokat (saját típusok), illetve lehetőség van rá hogy currying segítségével függvény-típusokat is megadhassunk.

Alap típusrendszer

  • egész típusok (alapvetően a .NET nyelvi egész típusa)
    • byte, sbyte, short, ushort, int, uint, long, ulong
    • longInt mint speciális, tetszőlegesen sok számjegyet kezelő egész szám típus
  • valós típusok (alapvetően a .NET nyelvi valós típusa)
    • float, double
    • longDouble, mint speciális, tetszőleges pontosságú, tetszőlegesen sok számjegyet kezelő valós szám típus
  • karakter (char)
  • szöveg (string)
  • logikai (bool)
  • dátum (date)
  • idő (time)
  • dátum és idő egyben (datetime)

Szigorú (strict) típusok

A típusok alapvetően lusta típusok, gépi ábrázolásban itt egy-egy lazy_data_struct-ra mutató pointer helyettesíti a tényleges adatot. Ebben a struktúrában tárolva van, hogy az adat kiértékelésre került-e már (I/N), amennyiben igen, mennyi lett az értéke. Amennyiben nem, úgy a kiszámításához szükséges utasítás-fa gyökér elemére mutató pointer is tárolásra kerül.

A még ki nem értékelt adat továbbadása során ezen struktúrára mutató pointer kerül továbbadásra. Az adat értékének kiszámítására csak akkor kerül sor, ha annak értéke ténylegesen szükségessé válik az adott ponton (lusta kiértékelés).

Szigorú kiértékelésű adatot a ! alkalmazásával tudunk jelölni. Pl. egy int függvény-paraméter deklarálása azt jelenti, hogy a függvény elfogad ilyen lazy_data_struct pointert is, amely vagy már kiértékelt értéket hordoz, vagy még csak a számítási fa gyökérelemét. A !int típusú függvény-paraméter azt jelenti, hogy az adott paraméter korábban már kiszámításra kellett kerüljön, és a függvény már ennek a konkrét értékét kapja meg, nem a struktúrára mutató pointert (amelyben egyébként maga az érték már szerepelne).

A szigorú kiértékelésű adatok ezért kevesebb memóriát foglalnak el működés közben, és velük a műveletvégzés gyorsabb. Amennyiben a függvény inline net.call hívást tartalmaz (külső .net dll-beli függvényt hív meg), úgy azok számára leggyakrabban ilyen szigorú kiértékelésű adatként adjuk oda az értéket.

Érdekes kombinációt alkothat ez a típus listákkal.

  • az [int] olyan lazy listát jelöl, amelynek minden eleme egy-egy ilyen lazy_data_struct-ra mutató pointer, ennek C#-beli megfelelője a lazy_data_struct< List< lazy_data_struct<int> > > lehetne.
  • Az ![!int] jelöli a List<int>-t, ahol az elemek is ki vannak számolva.
  • az [!int] olyan lista, melynek elemei kiszámított int-ek, de maga a lista lazy, vagyis: lazy_data_struct< List<int> >.
  • a ![int] jelöli a List< lazy_data_struct<int> > struktúrát, ahol a lista már eleve kész, de az elemei lazy int-ek.

Saját típusok

  • rekord típus létrehozása a record kulcsszóval (az indentálás a nyelvi szintaktikai része!):
record ember
  fizetes int
  eletkor int
  testhomerseklet float
  • touple típus létrehozása zárójelezéssel (ebben a példában mint függvény visszatérési típus):
func fileba_iras:File Int -> (Int,Bool)
  • lista létrehozása szögletes zárójelezéssel (listát vár paraméterként, és listát ad vissza):
func primek:[int] -> [int]

Függvények típusai

A függvények paramétereinek típusát megadhatjuk (statikus típusrendszer). Amennyiben nem adjuk meg, úgy a függvényhívások során automatikus típuslevezetés lesz alkalmazva, és az aktuális paraméterek típusai, valamint a függvény (meg nem adott) típusai közötti egyeztethetőség fordítási időben lesz ellenőrízve.

Egyszerű típusmegadás: a függvény argumentumainak típusai a kódban explicit módon meg lettek adva:

func:sinus double -> double
sinus rad = net.call { result = Math.Sin( rad ) }
 
func:sinusL longDouble -> longDouble
sinusL rad = net.call { result = ExtendMath.Sin( rad ) }

Amennyiben a függvénynél argumentum-típusok nem kerültek megadásra, úgy a paraméterekhez a fordító típus-sejtéseket fűz, és a konkrét függvény hívások esetén a konkrét típusok ismeretében olyan egyezéseket keres, ahol a sejtés illeszthető a típusokra:

cosinus rad = net.call { result = Math.Cos( rad ) }

A fenti esetben pl. sejthető, hogy a rad típusa double lesz, csakúgy mint a függvény visszatérési típusa is.

Típuslevezetés

Operátorok

Beépített operátorok

Operátorok bővíthetősége

Függvények

Függvény-törzsek írása

Mintaillesztés

Feltételes blokkok

A lap eredeti címe: „http://wiki.ektf.hu/wiki/Titan:m-syntax
Nézetek
nincs sb_18.218.234.83 cikk