5.03) Auto-Block-Funktion

Eine Auto-Block-Funktion ist die Standard-Funktion eines Objekts.

Nach einem Objekt

Werden die nachfolgenden Zeilen, nach einem Objekt eingerückt, so führt JM° die Auto-Block-Funktion des Objektes aus. Vorausgesetzt es besitzt eine:

For(3,5)
%.print

In anderen Programmiersprachen wäre "For" ein ganz normales Schlüsselwort. In JM° ist es aber ein ganz normales Objekt!
Hier wird also ein Objekt vom Typ "For" mit den Parametern 3 und 5 erzeugt. Da keine Funktion angegeben wurde, For aber die Funktion ".each" als Auto-Block-Funktion registriert hat, wird hier somit automatisch ".each" aufgerufen. Und die Funktion ".each" ruft wiederrum den Block mit den Werten, 3, 4 und 5 auf.

Nach einer Funktion

Die Auto-Block-Funktion kann auch nach einer Funktion verwendet werden. Voraussetzung hierfür ist, dass die Funktion klar einen Typ zurückgibt, der eine Auto-Block-Funktion hat.

"Dies ist ein Test".right(4).upper
%.print

Hier wird ein String erzeugt, die rechten vier Buchstaben abgetrennt und in Großbuchstaben umgewandelt.
Die Funktion ".upper" gibt klar einen neuen String zurück, kann allerdings selbst keinen Block verarbeiten. Deshalb wird hier geprüft ob das aktuelle Objekt, in dem Fall ein String, eine Auto-Block-Funktion besitzt. Und ja, ein String besitzt hier die Funktion ".each", mit der die Zeichen des Strings einzeln ausgewertet werden können. Somit erhalten wir als Ergebnis:

T
E
S
T

Wichtig ist nur, dass die Funktion klar einen Typ zurück gibt, der eine Auto-Block-Funktion hat.

Dieses Konzept kann für fortgeschrittene JM°-Programmierer, gerade bei Listen, die Arbeit vereinfachen und beschleunigen. Da es aber für Anfänger verwirrend erscheinen mag, ist dies schon bei ">strict" nicht mehr erlaubt.

Mach mal!

Die Auto-Block-Funktion kann auch direkt und dann sogar ohne Block aufgerufen werden. Die Funktion ".do" ruft direkt die Auto-Block-Funktion auf. Beim Typ "For", oder auch bei einer Liste, ist ".do" somit ein Alias für ".each".

l = ["abc", "def", "ghi"]
l.do.print

# Oder mit Block:
l.do
%.print