Am 26.04.2006 um 09:35 schrieb James Bielman:


You seem to be going to a fair bit of trouble here to reproduce what
the CFFI :STRING type does automatically... why not something like:

(defcfun ("Tcl_EvalFile" tcl-eval-file) :int
  (interp :pointer)
  (filename :string))

(defcfun ("Tcl_Eval" tcl-eval) :int
  (interp :pointer)
  (script :string))

instead of mucking about with low-level stuff like null terminators.
There is also WITH-FOREIGN-STRING that encapsulates this pattern in a
macro when you don't want to use the :STRING type.

Thx for pointing out. I took my approach straight from the example cl- opengl as done by - Luis, I think... ;-)


Also, one technique I've found very handy when writing bindings for
APIs that are consistent about returning error codes is to define a
special result type and hang a translator on it, to get automatic
error checking (untested, caveat executor):

;; Now TCL-EVAL-FILE and TCL-EVAL can return a TCL-ERROR instead of
;; :INT and the translator will get called on the return value.
(defctype tcl-error :int)

(defmethod translate-from-foreign (value (type (eql 'tcl-error)))
  (unless (zerop value) ;; or whatever
    (error "got some tcl error ~D..." value))
  value)

Superb. Works like a charm. Thanks!


Apart from any other TCL-specific issues like Yaroslav mentioned,
perhaps the TCL output stream is buffered and needs to be flushed
somehow?

Actually I had a typo in the source (missing paranthesis) that prevented the call of the Tcl function al all - so I was seeing the foreign ptr addresses as results ... That's why I was a bit surprised.

Now I can call Tcl_Eval and do get the message as defined via the puts command on the standard output stream.


James


Thanks again!

Frank

_______________________________________________
cffi-devel mailing list
cffi-devel@common-lisp.net
http://common-lisp.net/cgi-bin/mailman/listinfo/cffi-devel

Reply via email to