A MAXScript programozási nyelv

Utasítások, vezérlési szerkezetek

Értékadás, üres utasítás

Az értékadás <cél> = <kifejezés> alakú, ahol a cél lehet változónév, tulajdonság vagy tömbindex. Tulajdonságok és tömbindexek segítségével elérhetjük összetett értékek komponenseit, mint amilyenek a tömbök vagy háromdimenziós pontok. Értékadásra példák:

x = 2 + 2 * 3 y = [1, 2, 3] + pos z = #(1, 2, "foo", "bar") $box01.pos = baseObj.pos + (baseObj.radius*[0,0,1]) -- tulajdonság szerinti elérés z[2] = d.rotation as eulerangles -- tömbindex szerinti elérés

Az index- és tulajdonságelérők vonatkozhatnak blokk-kifejezésre is, például:

Készítünk egy másodpéldányt egy csomópontról, amely értéke a myNode változóban tárolt, majd beállítjuk a pozícióját a myNode szülőobjektumáéra: (instance myNode).pos=myNode.parent.pos Meghívjuk a find_table függvényt egy "foo" paraméterrel, majd a függvény által visszaadott tömb n-2-ik elemét megváltoztatjuk "fred"-re: (find_table "foo")[n - 2] = "fred"

 

Két változóérték felcserélésére beépített függvényt nyújt a MAXScript swap <cél> <cél> szintaxissal.

A MAXScript nyelvben nincs üres utasítás.

Szekvencia és blokk utasítás

A programszöveg kifejezésekből áll (legalább egyből), ezeket sortörés vagy ; jel választja el.

Blokkifejezés létrehozható kerek zárójelpár között (az utasítások elválasztására továbbra is a sortörés vagy a ; jel szolgál), például:

( print x; print y u += 10 print u; print z )

A nyelv érdekessége, hogy a nyelvi konstrukciók kifejezésekként használhatók. Így sok más nyelvtől eltérően egy blokk-kifejezés lehet operandus, azaz szerepelhez valamely kifejezés részeként. Egy blokk-kifejezés ilyenkor visszatér egy értékkel, amely az utolsó blokkbeli kifejezés által meghatározott. A következő példában a blokk-kifejezés eredménye a végső if kifejezés, amely értékül adódik egy koordinátának:

$box.pos.z = ( d = x^2 - y^2 if d > 0 then sqrt d else z )

Elágazás

Az feltétel szerinti elágaztatás, illetve az esetszétválasztás is lehetséges a nyelvben. A feltétel szerinti elágaztatásnak két alakja van: if <kifejezés> then <kifejezés> [else <kifejezés>] vagy if <kifejezés> do <kifejezés>, amely alakokban az első kifejezések tesztkifejezések, melyeknek true vagy false értékre kell kiértékelődniük, azaz például logikai kifejezések vagy összehasonlítások. Az elágazás maga is egy kifejezés, értéke a feltétel igaz volta esetén az igaz ágban lévő kifejezés értéke, egyéb esetben az opcionális else ág kifejezéséé. Amennyiben nincs else ág, vagy a do-s alakot használjuk és a feltétel hamisra értékelődik ki, akkor undefined értéket kap az if kifejezés.

a = (if d == 0 then 0 else a / d)

Esetszétválasztásnál egy kifejezés alapján tekinthetjük az egyes eseteket, az egyes esetek lehetnek számliterálok, névliterálok, string-literálok, változók, vagy blokk-kifejezések. Végrehajtáskor először kiértékelődik a szelektor kifejezés, majd az egyes ágakhoz tartozók addig, amíg megfelelően illeszkedőt nem talál a program. Minden címkének összehasonlíthatónak kell lennie a szelektorkifejezéssel. Opcionálisan megadható default ág is.

new_obj = case copy_type.state of ( 2: copy $foo 3: instance $foo default: reference $foo )

A szelektor kifejezés (teszt kifejezés) opcionális, ahogy az a következő példában láthatjuk:

case of ( (a > b): print "a nagy" (b < c): print "b kicsi" (c <= d*3): ... default: ... )

Ciklus

A ciklusok között megtalálhatók a normál elöl- és hátultesztelős ciklusok, illetve a léptetős for ciklus is. Az elöl- és hátultesztelős ciklusok szintaxisa: do <kifejezés> while <kifejezés> vagy while <kifejezés> do <kifejezés>. A ciklusmag végrehajtása addig ismétlődik, amíg a while után írt kifejezés true-ra nem értékelődik ki, a do-val kezdődő alak esetén a ciklusmag legalább egyszer végrehajtásra kerül.

while x > 0 do ( print x x -= 1 ) while not eof f do print (read_value f)

A for ciklus végigiterálhat számintervallumon, időértékeken vagy értékek sorozatán (így például tömb vagy objektumhalmaz esetén). A for ciklus szintaxisa: for <változónév> ( in | = ) <sorozat> ( do | collect ) <expr>. A változónév lesz ez esetben a ciklusváltozó, a sorozat pedig attól függ, milyen adatokon szeretnénk használni a ciklust (lásd a példát alább). Ennek a fajta ciklusnak két módja van: a do kulcsszó esetén minden lépésben kiértékelődik a kifejezés, a collect kulcsszó használata esetén azonban a kifejezések értékét a program egy tömbben el is tárolja, majd azt, mint a for kifejezés értékeként visszaadja (yield).

for i = 1 to 10 do print i -- számok sorozata for item in table1 do x = x + item.height -- egy tömb elemei for t in 0f to 100f by 5f do sliderTime=t -- időskálán 5 képkockánként lépdelve bigones = for obj in $box* -- meg lehet adni útvonalnév-sorozatot is! where obj.height > 100 collect obj -- összegyűjtjük a magas téglatesteket egy tömbbe

Egy ciklus következő végrehajtására ugorhatunk a continue kulcsszó segítségével:

for i=1 to 8 collect (if i == 5 do continue; i) -- visszatér a #(1, 2, 3, 4, 6, 7, 8) tömbbel

Ciklusból való kilépésre használható az exit [with <kifejezés>]:

while x < y do ( local delta = x - y if delta <= 0 then exit $foo.pos.x = compute_x (foo / delta) x += 0.1 )

Exit segítségével kilépni egy ciklusból nagyon ellenjavalt, ugyanis ehhez a végrehajtás során belsőleg egy try/catch részt használ a program, amely viszont jelentős mértékben lassíthatja a kód futását!