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