Tk and newLISP
updated Nov 27th, 2009
Normally newLISP uses the TclTk frontend newlisp-tk to run Tk based graphics applications. The following simple wrapper lets you run Tk based graphics programs just using the the console application newlisp on Linux/UNIX and a Tcl/Tk installation on your system.
The program calls the TclTk windows shell wish and communicates with it via two stdio pipes. This approach leads to a much faster integration between newLISP and Tcl/Tk compared with newlisp-tk approach via Tcp/Ip network sockets.
Try this to run swarm.lsp :
On Linux/Unix/OSX
./runtk swarm.lsp
On Windows
newlisp runtk swarm.lsp
The listing of runtk
For syntax highlighted version click here.#!/usr/bin/newlisp
; --- runtk v 1.4 updated for 10.1 LM Nov 27th, 2009 ---
;
; original version bye Fanda:
; http://www.intricatevisions.com/index.cgi?page=newlisp
;
; Run programs written for newlisp-tk without without it
; Only newLISP and a installation of Tcl/Tk is required.
;
; EXAMPLE on Linux/UNIX and Win32:
;
; runtk myprog.lsp
;
; myprog.lsp could also be directly embedded
; inside this wrapper (see bottom of this file).
; setup communications to Tcl/Tk
(map set '(myin tcout) (pipe))
(map set '(tcin myout) (pipe))
(process "/usr/bin/wish" tcin tcout)
; tk function to pass commands to Tcl/Tk
(define (tk)
(write-line myout (append "if { [catch { puts ["
(apply string (args)) "] }] } { "
[text] tk_messageBox -message $errorInfo; exit }
[/text]))
(let (str "")
(while (starts-with (setq str (read-line myin)) "newLISP:")
(eval-string ((length "newLISP: ") -1 str)))
str))
(global 'tk)
;; this is for compatibility with newlisp-tk for running
;; the Demo.lsp programs distributed with newlisp-tk
;; for new programs just use 'puts' without the 'Newlisp' wrapper
(tk "proc Newlisp { command } { puts $command }")
;; exit when main window is closed
(tk "bind . <Destroy> {puts {(exit)}}")
;; get program from command line or insert the program here
(load (main-args 2))
;; process incoming newLISP requests
(while (read-line myin)
(eval-string (current-line)))
;; eof
Back to Tips&Tricks