I have a with-errno <https://github.com/ffilozov/cffi/tree/with-errno>implementation.
On Wed, Aug 14, 2013 at 5:23 PM, Felix Filozov <ffilo...@gmail.com> wrote: > Ah, I understand why it has to be dynamic now. I'll start working on > with-errno then. > > The consing problem is clearer now, but I wonder how much overhead it adds > compared to the cost of making a foreign call. According to the Allegro CL > documentation, a foreign call which returns errno is less efficient. For > other Lisps, an additional foreign call would have to be made to get errno. > Maybe consing is negligible? > > > On Wed, Aug 14, 2013 at 3:04 PM, Luís Oliveira <luis...@gmail.com> wrote: > > Felix Filozov <ffilo...@gmail.com> writes: >> >> > Maybe we can even do this using lexical binding, since GET-ERRNO could >> > be a macro that expands to a lexical variable introduced by >> > WITH-ERRNO. >> >> The issue there is that foreign-funcall will be setting errno. >> >> >> > Could you elaborate where there's a consing issue, if errno is >> > returned as the last, or first, value? >> >> So, the pseudo-code for the implementation in foreign-funcall would be >> something like: >> >> (multiple-value-bind (return-value errno) >> (%foreign-funcal ...) >> (let ((translated-return-values (multiple-value-list >> (translate-from-foreign ...)))) >> (values-list (cons errno translated-return-values)) >> ;; or (values-list (nconc translated-return-values (list errno))) >> )) >> >> Right now I'm inclined to discard all but the first translated return >> value. (This is your initial solution, isn't it?) >> >> Luís >> >> >> > > On Wed, Aug 14, 2013 at 3:04 PM, Luís Oliveira <luis...@gmail.com> wrote: > >> Felix Filozov <ffilo...@gmail.com> writes: >> >> > Maybe we can even do this using lexical binding, since GET-ERRNO could >> > be a macro that expands to a lexical variable introduced by >> > WITH-ERRNO. >> >> The issue there is that foreign-funcall will be setting errno. >> >> >> > Could you elaborate where there's a consing issue, if errno is >> > returned as the last, or first, value? >> >> So, the pseudo-code for the implementation in foreign-funcall would be >> something like: >> >> (multiple-value-bind (return-value errno) >> (%foreign-funcal ...) >> (let ((translated-return-values (multiple-value-list >> (translate-from-foreign ...)))) >> (values-list (cons errno translated-return-values)) >> ;; or (values-list (nconc translated-return-values (list errno))) >> )) >> >> Right now I'm inclined to discard all but the first translated return >> value. (This is your initial solution, isn't it?) >> >> Luís >> >> >> >