newLISP

Eine verrückte kleine Scripting-Sprache ist newLISP. Verrückt, weil die Listen nicht mit Lisp-typischen Knoten erstellt sind. Die Speicherverwaltung kommt ohne den Garbage Collect aus mit Effekt Tempogewinn. Aus irgendwelchen Gründen mag ich es.

In früheren Versionen gab es eine Version mit generischer Unterstützung für GUI mit Tcl/Tk. Heute geschieht diese durch das Script tk.lsp.

Das Script kontrolliert mittels einer pipe die Scripting-Sprache Tcl/Tk. Standard-Ein-Ausgabe scheiden damit aus für die Interaktion mit dem Menschen.

Um dennoch eine Eingabezeile zu schaffen bittet das newLISP-Script rep.lsp das Tcl-Script rep.tcl freundlich um dessen Einrichtung.

Aufruf geht so:

> newlisp tk.lsp rep.lsp

Benutzung geht so: Funktionsaufruf in die Zeile schreiben und Return-Taste.

Um z. B. ein neues Toplevel-Widget mit Breite und Höhe zu erstellen dient die Funktion (tk ...):

> (tk " toplevel .t -width 100 -height 50 ")

Nebeneffekte bei newLISP und tk.lsp: Symbole tk myin myout tcin tcout belegen den Basis-Namensraum.

Bei rep.lsp: Symbole escape typedString respond belegen den Basis-Namensraum.

Nebeneffekte bei Tcl/Tk: Toplevel-Widget .rep belegt Namensraum der Widgets; Prozedur println belegt den Namensraum der Prozeduren.

Das hält sich alles noch im Rahmen, würde ich sagen. – Entkäfert hab ichs noch nicht, aber die Funktionen sind so weit abgespeckt, dass nicht viel zu erwarten ist.

Was der Meister sich verkniff, bis dato zumindest, ist Aufpusten auf Komfortabel wie bei Chicken/Tk. Schauʼ mer ma.

Also wer will – Copy & Paste locken. Und wer sichs zutraut: anpassen an eigene Bedürfnisse. Vergnügen!


Siehe auch Fanclub von newLISP


Nachtrag 25.02.2023 – Ich habe mit einer Syntax-Maschine für etwas Komfort gesorgt.

Zum Einen sind die Tcl/Tk-Spezifika sämtlich im Namensraum Tk untergebracht, beengen also nicht weiter die Kreativität bei späterer Programmiertätigkeit.

Zum Andern habe ich die Tcl-Syntax komfortabler gestaltet.

Stopp der Ereignisschleife:

(Tk:event-loop nil)
nil

Start der Ereignisschleife vom Terminal aus:

(Tk:event-loop true)

(Keine Bestätigung im Terminal, Tcl/Tk interagiert.)

Start des Read-Eval-Print-Fenster im Terminal:

(Tk:read-eval-print true)

Stopp des Read-Eval-Print-Fenster im Terminal:

(Tk:read-eval-print nil)

Das Fenster ist nun von newLISP entkoppelt.

Ein separates Tcl/Tk-Skript ist nicht mehr erforderlich, dessen Quelltext übergibt newLISP auf geradem Wege dem soeben aufgerufenen Prozess wish.

Aufruf:

newlisp Tk.lsp

Eingabe, etwa das Root-Fenster zu positionieren – alte Methode (funktioniert weiterhin):

(Tk " wm geometry . +0+0 ")
""

Eingabe komfortabler:

(Tk wm geometry . "+0+0")
""

Erklärung dazu: Tk ist der Funktor, ein Makro mit diesem Verhalten:

Fahren wir fort:

(Tk pack (Tk text .t) -expand 'yes -fill 'both)
""

Diese Argumente zu Tk werden generell nicht gequotet:

Wenn Tcl/Tk-Argumente von newLISP irrtümlich als Zahl interpretiert werden können, sind diese mit Gänsefüßchen als Zeichenfolge (String) kenntlich zu machen, etwa wenn das Text-Widget an Position 1.0 den Text „Hallo“ anzeigen soll:

(Tk .t insert "1.0" 'Hallo!)
""

Übernahme wie immer durch Copy & Paste in eine Datei Tk.lsp. Testläufe zum Entkäfern willkommen. Vergnügen!


Nachtrag 22.03.2023 – bei Tk mit newLISP unter Betriebssystem Unix ist das Read-Eval-Print-Fenster verzichtbar, da mithilfe der Funktion peek eine Ereignisschleife realisiert werden konnte. Die Funktion peek ist laut Dokumentation nur auf Unix-basierten Betriebssystemen verfügbar, beispielsweise meinem Linux Mint.

Die Funktionen für Tcl/Tk werden mit dem Makro Tk aufgerufen. So können Sie zwei Widgets .a und .b der Klasse Toplevel erstellen:

  1. (Tk "toplevel .a") ;; also als String wie oben, oder
  2. (Tk toplevel .b) ;; also als Symbole ohne Quote oder Gänsefüßchen.

Im letzteren Beispiel wird Argument 1 (hier toplevel) nie evaluiert; Argument 2 (hier .b) deshalb nicht, weil es ein Atom ist. Eine Liste würde auf jedenfall evaluiert, beispielsweise hier:

  1. (Tk pack (Tk canvas .c) -expand 'yes) ;; das zweite Argument evaluiert zu einem Widget der Klasse Canvas .

Für die weiteren Argumente gelten die Regeln unten.

Dabei entstehen im Namensraum MAIN automatisch Makros für die Widgets, im Beispiel .a .b .c .

So können Sie die erzeugten Widgets aufrufen:

  1. (Tk ".a configure") ;; als String wie oben, oder
  2. (.b configure) ;; als direkter Makro-Aufruf für .b .

Bei der letztere Methode gelten diese Regeln:

  1. Ereignisse, etwa <Button-1>, werden nicht gequotet.
  2. Attributnamen, etwa -bd, werden nicht gequotet.
  3. Widgets, etwa .topwin, werden nicht gequotet.
  4. Andere Symbole, etwa 'yes, werden immer gequotet.
  5. Angaben mit Ziffern, etwa "+0+0" oder {1.15+1l}, werden als Strings in Gänsefüßchen oder geschweifte Klammern gestellt.

Es ist ratsam, das praktisch einzuüben.

6.1.2023