![](https://secure.gravatar.com/avatar/9fda7fbd6217f4d84a55e5c5b48a2106.jpg?s=120&d=mm&r=g)
Hi! Thanks for looking into this ... I want to call the functions Tcl_CreateInterp and Tcl_Eval from Lisp. So I defined the libs and the functions : CODE: (in-package :cl-user) (defpackage :org.gt.test.cffi-tcltk (:use #:common-lisp) (:nicknames :gt.cffi-tcltk) (:export #:test-it ;; test function )) (in-package #:org.gt.test.cffi-tcltk) (eval-when (:load-toplevel :compile-toplevel :execute) #+asdf (progn #-cffi (progn (asdf:operate 'asdf:load-op :cffi) (use-package :cffi)) ) ) (eval-when (:load-toplevel :execute) (progn (define-foreign-library Tcl (:darwin (:framework "Tcl"))) (define-foreign-library Tk (:darwin (:framework "Tk"))) ) ) (eval-when (:load-toplevel :compile :execute) (progn ;; See also: ;; http://aspn.activestate.com/ASPN/docs/ActiveTcl_/8.4/tcl/ TclLib/Eval.htm ;; Tcl_CreateInterp (defcfun ("Tcl_CreateInterp" %Tcl_CreateInterp) :pointer) (defun Tcl_CreateInterp () (%Tcl_CreateInterp)) ;; Tcl_EvalFile (defcfun ("Tcl_EvalFile" %Tcl_EvalFile) :int (interp :pointer) (filename-cstr :pointer)) (defun Tcl_EvalFile (interp filename) (with-foreign-pointer (filename-cstr (length filename) strlen) (setf (mem-ref filename-cstr :char (1- strlen)) 0) (lisp-string-to-foreign filename filename-cstr strlen) %Tcl_EvalFile interp filename-cstr)) ;; Tcl_Eval (defcfun ("Tcl_Eval" %Tcl_Eval) :int (interp :pointer) (script-cstr :pointer)) (defun Tcl_Eval (interp script) (with-foreign-pointer (script-cstr (length script) strlen) (setf (mem-ref script-cstr :char (1- strlen)) 0) (lisp-string-to-foreign script script-cstr strlen) %Tcl_Eval interp script-cstr)) ) ) --- Now, we should be able to call the functions as expected: CODE: ;; Initialization mgmt - required to avoid multiple library loads (defvar *initialized* nil) (defun set-initialized () (setq *initialized* t)) (defun reset-initialized () (setq *initialized* nil)) ;; Tcl/Tk functions: execute a file and execute a script (defun exec-file (filename) (unless *initialized* ;; Could be simplified (use-foreign-library Tcl) (use-foreign-library Tk) (set-initialized)) (let* ((tcl-interp (Tcl_CreateInterp)) (rc (Tcl_EvalFile tcl-interp filename))) (format t "~%Tcl_EvalFile returned ~D~%" rc))) (defun exec-script (script) (unless *initialized* ;; Could be simplified (use-foreign-library Tcl) (use-foreign-library Tk) (set-initialized)) (let* ((tcl-interp (Tcl_CreateInterp)) (rc (Tcl_Eval tcl-interp script))) (format t "~%Tcl_Eval returned ~D~%" rc))) ;; We test just the script here (defun test-it () (exec-script "puts \"Hi !\"")) ;; Hmmm - no output generated. Why ? --- When calling the test function with: CL-USER > (gt.cffi-tcltk:test-it) I do not see any output anywhere. I also see that the returned value is like an error value ... I am on OS X 10.4.6 (Intel) with CFFI latest tarball and AllegroCL8.0. Any help really appreciated !!! Cheers Frank