Lingo Library, Part II (05/2001, Dir 8)

In diesem Bereich befinden sich Artikel und Tutorials zum Thema Director.

Moderatoren: Bär, Admin

Antworten
Admin
Site Admin
Beiträge: 41344
Registriert: 07.02.2006, 2006 16:09
Wohnort: München
Kontaktdaten:

Lingo Library, Part II (05/2001, Dir 8)

Beitrag von Admin » 11.02.2006, 2006 17:12

Lingo Library, Part II

Im letzten "thema" haben wir begonnen die internen Lingo Funktionen durch eigene Lingo Funktionen zu erweitern, und aus den gesammelten Funktionen eine "Lingo Library" zu erstellen.

Im ersten Teil lag der Schwerpunkt darauf einige in Lingo nicht, oder auch noch nicht vorhandene Funktionen zu erstellen. Diese Funktionen bezogen sich ausschließlich auf Listen und Strings. Auch dieses Mal soll es wieder primär um Listen gehen. Das hat zum einen den Grund, dass Lingo einige aus anderen Sprachen bekannte Listen Funktionen fehlen und zum anderen, dass Listen zu den stärksten Datentypen in Lingo gehören und viele Funktionalitäten auf Listen als Datencontainer aufbauen.

Die Funktionen können einfach in die begonnene Library übernommen werden, so dass sich mit der Zeit eine praktische Sammlung verschiedenster Funktionen ergibt, die bei eigentlich allen Projekten Anwendung finden und dadurch Arbeit ersparen kann.


Die Funktionen

In dieser zweiten Folge (Part 2) werden wir vier kleine und sehr praktische Funktionen für die Arbeit mit Listen erstellen. Wieder geht es darum die internen Lingo Funktionen zu erweitern, teilweise um Funktionen die einigen Entwicklern aus anderen Sprachen bekannt vorkommen werden.

Zu beachten ist bei diesen Funktionen, dass der Rückgabewert der Funktionen stets eine neue Liste ist. Alle Veränderungen finden also nicht an der übergebenen Liste direkt, sondern immer an einer Kopie statt. Dadurch kann die ursprüngliche Liste problemlos weiterverwendet werden, ohne dass vorher eine Kopie gemacht werden muss


Die list_rotate() Funktion

Code: Alles auswählen

-- -----------------------------
-- rotate a list n times
-- -----------------------------
on list_rotate (myList, myRotation)
  if myRotation < 0 then myRotation = myList.count + myRotation
  listCount = myList.count
  repeat with i = 1 to myRotation
    tmpList = []
    repeat with j = 1 to listCount
      tmpList.setAt(j mod listCount + 1, myList[j])
    end repeat
    myList = duplicate(tmpList)
  end repeat
  return myList
end list_rotate
Diese Funktion rotiert die Elemente in einer linearen Liste um die angegebene Anzahl von Stellen (myRotation) in beide Richtungen, je nachdem ob der Rotationswert positiv oder negativ ist. Dabei werden die jeweils am Ende der Liste stehenden Elemente, wenn sie über das Ende der Liste hinaus verschoben werden wieder an den Anfang gesetzt. Dadurch entsteht dann die eigentliche Rotation.

Wichtig: Der Rückgabewert der Funktion ist eine neue Liste, die Veränderungen finden nicht an der übergebenen Liste statt.

Beispiel:

Code: Alles auswählen

aList = [1,2,3,4,5,6,7,8,9,10]
put list_rotate(aList, 3)
-- [8, 9, 10, 1, 2, 3, 4, 5, 6, 7]
put list_rotate(aList, -2)
-- [3, 4, 5, 6, 7, 8, 9, 10, 1, 2]

Die list_everse() Funktion

Code: Alles auswählen

-- -----------------------------
-- reverse a list
-- -----------------------------
on list_reverse (myList)
  retVal = []
  listCount = myList.count
  repeat with i = listCount down to 1
    retVal.append(myList[i])
  end repeat
  return retVal
end list_reverse
Diese sehr einfache Funktion dreht eine lineare Liste um, bzw. invertiert die Reihenfolge der Elemente in der Liste.

Wichtig: Der Rückgabewert der Funktion ist eine neue Liste, die Veränderungen finden nicht an der übergebenen Liste statt.

Beispiel:

Code: Alles auswählen

aList = [1,2,3,4,5,6,7,8,9,10]
put list_reverse(aList)
-- [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

Die list_shuffle() Funktion

Code: Alles auswählen

-- -----------------------------
-- randomly shuffle a list
-- -----------------------------
on list_shuffle (myList)
  retVal = []
  tmpList = duplicate(myList)
  repeat while tmpList.count
    rand = random(tmpList.count)
    retVal.add(tmpList[rand])
    tmpList.deleteAt(rand)
  end repeat
  return retVal
end list_shuffle
Diese Funktion mischt die Reihenfolge der Elemente in einer linearen Liste nach dem Zufallsprinzip neu. Dabei wird die interne random() Funktion verwendet um jeweils Elemente an einer zufällig gewählten Position der übergebenen Liste zu entnehmen. Die Qualität dieses "Zufalls" hängt also maßgeblich von dieser Funktion ab.

Wichtig: Der Rückgabewert der Funktion ist eine neue Liste, die Veränderungen finden nicht an der übergebenen Liste statt.

Beispiel:

Code: Alles auswählen

aList = [1,2,3,4,5,6,7,8,9,10]
put list_shuffle(aList)
-- [5, 8, 9, 2, 6, 1, 4, 7, 3, 10]

Die list_sortByVal() Funktion

Code: Alles auswählen

-- -----------------------------
-- sort prop list by value
-- -----------------------------
on list_sortByVal (myList)
  retVal = [:]
  sortedList = [:]
  sortedList.sort()
  entryCount = myList.count
  repeat with i = 1 to entryCount
    myProp = myList.getPropAt(i)
    myVal = myList[i]
    sortedList.addProp(myVal, myProp)
  end repeat
  repeat with i = entryCount down to 1
    myProp = sortedList[i]
    myVal = sortedList.getPropAt(i)
    retVal.addProp(myProp, myVal)
  end repeat
  return retVal
end list_sortByVal
Diese Funktion sortiert eine Property Liste nach Werten. Leider kann die interne sort() Funktion eine Liste nur nach Properties und nicht nach Werten sortieren. In vielen Fällen, z.B. bei einer Highscore Liste ist aber eine Sortierung nach Werten notwendig.

Die Funktion verwendet eine separate sortierte Liste als Zwischenspeicher, da zunächst die Property / Wert Paare umgekehrt werden müssen. Anschließend wird diese sortierte Zwischenliste in die finale Liste geschrieben, wobei die Property / Wert Paare erneut umgekehrt werden.

Wichtig: Der Rückgabewert der Funktion ist eine neue Liste, die Veränderungen finden nicht an der übergebenen Liste statt.

Beispiel:

Code: Alles auswählen

aPropList = ["Player 1": 500, "Player 2": 700, "Player 3": 400, "Player 4": 800]
put list_sortByVal(aPropList)
-- ["Player 4": 800, "Player 2": 700, "Player 1": 500, "Player 3": 400]

Alle Funktionen in einem Beispiel:

Code: Alles auswählen

-- Welcome to Director --
aList = [1,2,3,4,5,6,7,8,9,10]
put list_rotate(aList, 3)
-- [8, 9, 10, 1, 2, 3, 4, 5, 6, 7]
put list_rotate(aList, -2)
-- [3, 4, 5, 6, 7, 8, 9, 10, 1, 2]
put list_reverse(aList)
-- [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
put list_shuffle(aList)
-- [5, 8, 9, 2, 6, 1, 4, 7, 3, 10]
aPropList = ["Player 1": 500, "Player 2": 700, "Player 3": 400, "Player 4": 800]
put list_sortByVal(aPropList)
-- ["Player 4": 800, "Player 2": 700, "Player 1": 500, "Player 3": 400]

Fazit

Die beschriebenen Funktionen sind teilweise sehr einfach und lassen sich bei Bedarf auch schnell für andere Anforderungen erweitern. Den Erweiterungen sind dabei im Prinzip keine Grenzen gesetzt, solange die Funktion selbst generisch bleibt. Besonders beim Thema "Zufälle" lassen sich noch einige Dinge ändern um das Ergebnis zu zufällig wie möglich zu machen, doch das ist ein Kapitel für sich und wird bei entsprechender Gelegenheit vielleicht einmal an dieser Stelle behandelt werden.

Beispielfilm als Download: upload/lingo-lib-II.zip


Autor: Martin Kloss

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast