| 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.