<div class="gmail_extra">On Sat, Dec 8, 2012 at 7:27 PM, Peter Keller <span dir="ltr"><<a href="mailto:psilord@cs.wisc.edu" target="_blank">psilord@cs.wisc.edu</a>></span> wrote:<br><div class="gmail_quote"><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">

<br>
Is what I'm doing really off base?<br></blockquote><div><br></div><div>First, I am not sure whether you really need to translate objects, or whether you can simply live with the pointers around. If you look at ECL's FFI, it provides the lisp world with means to access the values in a C structure, to allocate structures, to modify them and even to call C functions. This code can be used also in C (arbitrary lisp code can be evaluated in C as discussed before), so I really do not see why you would go all the hassle to create lisp structures.</div>

<div><br></div><div>Second, do not use functions prefixed with si_ if you can, for they are private and to be used by ECL's core library. The exception are those which carry the si_ prefix but actually denote funcitons that belong to the EXT package, such as si_safe_eval().</div>

<div><br></div><div>More generally, do not use anything which is not part of the ANSI Specification. Every function and facility in Common Lisp has an equivalent form in the C library, learn to use them. If Common Lisp programmers are happy with what it provides, why should you embedding ECL need anything else? Of course, in this case you need not restrict yourself to the cl_* functions, but sometimes also use the ecl_* prefixed ones, which are usually faster.</div>

<div><br></div><div>Say for instance you need to create structures with two slots</div><div><br></div><div>* Evaluate a "(defstruct foo a b)" form at the outer part of your code (c_string_to_object + cl_eval)</div>

<div>* Store global references to the symbols MAKE-FOO, :A and :B (this is safe, for symbols in packages are not garbage collected)<br></div><div>* Define a simple C function that uses that symbol to invoke the structure creation.<br>

</div><div><br></div><div>const char *defstruct_form = "(defstruct cl-user::foo a b)"</div><div>cl_object make_foo = ecl_read_from_cstring("cl-user::make-foo");</div><div>cl_object keyword_a = ecl_make_keyword("A");</div>

<div>cl_object keyword_a = ecl_make_keyword("B");</div><div><br></div><div>cl_object make_foo(int a, const char *b)</div><div>{</div><div>   return cl_funcall(5, make_foo, keyword_a, ecl_make_fixnum(a), keyword_b, ecl_make_constant_base_string(b, strlen(b)));</div>

<div>}</div><div><br></div><div>int main () {</div><div>...</div><div>cl_eval(1,ecl_read_from_cstring(defstruct_form));</div><div>...</div><div>}</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 class="im">I'm willing to write some tutorials or edit the manual and add this<br></div>
kind knowledge wherever you'd like.</blockquote></div><br>That would be very much appreciated. There is a lot of information in the manual, but it can be improved.</div><div class="gmail_extra"><br></div><div class="gmail_extra">

Juanjo<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><br>


</div>