<div dir="ltr">Hi Juan,<div><div><br></div><div class="gmail_extra"><div class="gmail_quote">On Tue, May 21, 2013 at 6:13 PM, Juan Jose Garcia-Ripoll <span dir="ltr"><<a href="mailto:juanjose.garciaripoll@gmail.com" target="_blank">juanjose.garciaripoll@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="im"><br>
</div>The CFFI model is simply too rigid: they assume that libraries can be loaded at run time, always. Instead ECL supports also a model in which libraries are linked with the compiled code, being available that way. I fear there is no way to work around this but using ECL's own FFI mingled with CFFI</div>


<div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra">> (ql:quickload :cffi)</div><div class="gmail_extra">> (compile-file "foo.lsp" :load t)</div></div></div></blockquote><div>
<br></div><div style>Here what I get when trying this on windows:</div><div style><br></div><div style>===</div><div style> $ /cygdrive/c/Users/dietrich/home/cs/lang/lisp/ecl/64/git/install/ecl.exe</div><div>;;; Loading "E:/Users/dietrich/home/cs/lang/lisp/ecl/ecl/64/git/library/quicklisp/install/setup.lisp"</div>
<div>;;; Loading #P"C:/Users/dietrich/home/cs/lang/lisp/ecl/64/git/install/asdf.fas"</div><div>ECL (Embeddable Common-Lisp) 13.4.1 (git:0e93edfc7aefe16bb5b0fc20d4735ae69ac346ce)</div><div>Copyright (C) 1984 Taiichi Yuasa and Masami Hagiya</div>
<div>Copyright (C) 1993 Giuseppe Attardi</div><div>Copyright (C) 2000 Juan J. Garcia-Ripoll</div><div>ECL is free software, and you are welcome to redistribute it</div><div>under certain conditions; see file 'Copyright' for details.</div>
<div>Type :h for Help.  </div><div>Top level in: #<process TOP-LEVEL>.</div><div>> (ql:quickload :cffi)</div><div>To load "cffi":</div><div>  Load 1 ASDF system:</div><div>    cffi</div><div>; Loading "cffi"</div>
<div><br></div><div>(:CFFI)</div><div>> (compile-file "foo.lsp" :load t)</div><div><br></div><div>;;; Compiling foo.lsp</div><div>;;; Compiling #<input stream foo.lsp></div><div>;;; Loading "E:/Users/dietrich/home/cs/lang/lisp/ecl/ecl/64/git/diary/2013/05/22/cffi-user/foo.fasc"</div>
<div><br></div><div>Condition of type: SIMPLE-ERROR</div><div>In interpreted code, attempted to call a foreign function</div><div> #<foreign POINTER-VOID></div><div>but ECL was built without support for that.</div><div>
Available restarts:</div><div><br></div><div>1. (RESTART-TOPLEVEL) Go back to Top-Level REPL.</div><div><br></div><div>Broken at CFFI-USER::MYCOS. In: #<process TOP-LEVEL>.</div><div> File: #P"E:/Users/dietrich/home/cs/lang/lisp/ecl/ecl/64/git/diary/2013/05/22/cffi-user/foo.lsp" (Position #317)</div>
<div>>> :q</div><div><br></div><div>Top level in: #<process TOP-LEVEL>.</div><div>> (quit)</div><div>===</div><div><br></div><div style>How can I build ECL to support calling a foreign function?</div><div style>
<br></div><div style>Thanks a lot,</div><div style><br></div><div style>Dietrich</div><div style><br></div><div style>===</div><div style>PS:  The code works on darwin when I change '#+ecl' to '#+(and ecl (not darwin))' as the -lm option is enough and (ffi:load-foreign-library "/usr/lib/libm.dylib" :system-library nil) shouldn't be read; on Windows I used #+(and ecl (not darwin) (not windows)) to avoid the reading of (ffi:load-foreign-library "/usr/lib/libm.dylib" :system-library nil).</div>
<div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra">


<div><br></div></div><div class="gmail_extra"><br></div><div class="gmail_extra">----</div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra">;;; Nothing special about the "CFFI-USER" package.  We're just</div>


<div class="gmail_extra">;;; using it as a substitute for your own CL package.</div><div class="gmail_extra">(defpackage :cffi-user</div><div class="gmail_extra">  (:use :common-lisp :cffi))</div><div class="gmail_extra">


<br></div><div class="gmail_extra">(in-package :cffi-user)</div><div class="gmail_extra"><br></div><div class="gmail_extra">#-ecl</div><div class="gmail_extra">(progn</div><div class="gmail_extra">  (define-foreign-library libm</div>


<div class="gmail_extra">      (:unix (:or "libm.so" "libm.dylib"))</div><div class="gmail_extra">    (t (:default "libm")))</div><div class="gmail_extra">  (use-foreign-library libm))</div>

<div class="gmail_extra">
<br></div><div class="gmail_extra">#+ecl</div><div class="gmail_extra">(ffi:load-foreign-library "/usr/lib/libm.dylib" :system-library nil)</div><div class="gmail_extra"><br></div><div class="gmail_extra">;;; Initialize libcurl with FLAGS.</div>


<div class="gmail_extra">(defcfun (mycos "cos") :double (value :double))</div><div class="gmail_extra"><br></div><div class="gmail_extra">(format t "C:    cos(~e) = ~g~%" 3.2d0 (mycos 3.2d0))</div><div class="gmail_extra">


(format t "Lisp: cos(~e) = ~g~%" 3.2d0 (cos 3.2d0))</div><div class="im"><div><br></div><br clear="all"><div><br></div>-- <br>Instituto de Física Fundamental, CSIC<br>c/ Serrano, 113b, Madrid 28006 (Spain) <br>
<a href="http://juanjose.garciaripoll.googlepages.com" target="_blank">http://juanjose.garciaripoll.googlepages.com</a>
</div></div></div>
</blockquote></div><br></div></div></div>