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.