Documentation: Alien access to a tcl interpreter
|
This page provides an example of using the CMUCL foreign function
interface to call a Tcl interpreter.
This is a naive way of calling out to Tcl; it wouldn't be much more
complicated to bind to a persistent interpreter to avoid instance creation
overhead on each call to EVAL-IN-TCL.
;;; Evaluate (alien:load-foreign "/usr/lib/libtcl8.0.so") before
;;; compiling or loading this file.
(in-package :CL-USER)
(alien:def-alien-type tcl-interp (* t))
(declaim (inline tcl-createinterp))
(alien:def-alien-routine "Tcl_CreateInterp" tcl-interp)
(declaim (inline tcl-eval))
(alien:def-alien-routine "Tcl_Eval" c-call:int
(interp tcl-interp :in)
(string c-call:c-string :in))
(declaim (inline tcl-getstringresult))
(alien:def-alien-routine "Tcl_GetStringResult" c-call:c-string
(interp tcl-interp :in))
(declaim (inline tcl-deleteinterp))
(alien:def-alien-routine "Tcl_DeleteInterp" c-call:void
(interp tcl-interp :in))
(defun eval-in-tcl (string)
(let ((inter (tcl-createinterp)))
(unwind-protect
(let* ((result-code (tcl-eval inter string))
(result-string (tcl-getstringresult inter)))
(values result-code (copy-seq result-string)))
(tcl-deleteinterp inter))))
Once you have loaded the code, you can evaluate expressions in Tcl from
CMUCL as follows:
USER> (eval-in-tcl "puts [expr 2 + 3]")
5
0
""
This description is adapted from an article
<87ya8j77df.fsf@orion.dent.isdn.cs.tu-berlin.de> posted to
the USENET group comp.lang.lisp on 2000-02-18 by Pierre Mai.
|