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:
- Das erste Argument – im Beispiel
wm
– wird als Tcl/Tk-Kommando nie evaluiert, ist also nicht mit Quote'
zu „entschärfen“. - Das zweite Argument – im Beispiel
geometry
– wird deshalb nicht evaluiert, weil es ein Atom ist. Wäre es eine Liste, etwa(Tk text .t)
, würde diese als Funktionsaufruf evaluiert.
Fahren wir fort:
(Tk pack (Tk text .t) -expand 'yes -fill 'both) ""
- Das zweite Argument –
(Tk text .t)
– evaluierte, weil Liste, zum Widget.t
, welches sodann mit dem Geometrie-Managerpack
im Root-Fenster.
angeordnet wird. - Weitere Argumente
-expand
und-fill
– werden anhand des führenden Strichs - als Schalter erkannt und sind nicht zu evaluieren. - Die Argumente
yes
undboth
müssen gequotet werden, da normale Schaltwerte.
Diese Argumente zu Tk
werden generell nicht gequotet:
- Attribute, kenntlich am führenden Strich, etwa
-width
; - Ereignisse, kenntlich am führenden Kleiner-Zeichen, etwa
<Destroy>
; - Widgets, kenntlich am führenden Punkt, etwa
.t
.
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:
(Tk "toplevel .a") ;;
also als String wie oben, oder(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:
(Tk pack (Tk canvas .c) -expand 'yes) ;;
das zweite Argument evaluiert zu einem Widget der KlasseCanvas
.
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:
(Tk ".a configure") ;;
als String wie oben, oder(.b configure) ;;
als direkter Makro-Aufruf für.b
.
Bei der letztere Methode gelten diese Regeln:
- Ereignisse, etwa
<Button-1>
, werden nicht gequotet. - Attributnamen, etwa
-bd
, werden nicht gequotet. - Widgets, etwa
.topwin
, werden nicht gequotet. - Andere Symbole, etwa
'yes
, werden immer gequotet. - 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
<< | Heimatseite | Verzeichnis | Stichworte | Autor | >>