On 22 Sep 2013, at 22:18, Scott McKay <swmc...@gmail.com> wrote:

> It's sad that this conses…

True. I think I will use the single-value version for my own purposes. If this 
were to become part of a utilities library, it should probably best be split 
into a single-value ASSURE and a MULTIPLE-VALUE-ASSURE for multiple values, so 
you only pay for the overhead when you actually need it.

Pascal

> On Sun, Sep 22, 2013 at 3:44 PM, Pascal Costanza <p...@p-cos.net> wrote:
> 
> On 22 Sep 2013, at 20:45, Steve Haflich <shafl...@gmail.com> wrote:
> 
>> No, it is generally possible to write portable setf expanders that work with 
>> multiple-value places provided the platform conforms to the ANS 
>> requirements. I have some extreme examples on another machine I may share to 
>> the list later.
>> 
>> I think to be portable transparent assure would need to collect and return 
>> multiple values, with the hope that the compiler would eliminate that stuff 
>> if the place were a single-value form like a variable or known function.
> 
> OK, it seems you mean something like this:
> 
> (defmacro assure (type form &environment env)
>   (multiple-value-bind
>       (vars vals store-vars writer reader)
>       (get-setf-expansion ,form env)
>     (declare (ignore store-vars writer))
>     `(let* ,(mapcar 'list vars vals)
>        (check-type ,reader ,type)
>        ,reader)))
> 
> However, this is not good enough. Something as simple as (assure integer (+ x 
> y)) already doesn't work. The requirement that form is a generalized 
> reference is an artifact that comes from check-type, but that shouldn't leak 
> through.
> 
> I came up with another version. I believe this should work:
> 
> (defmacro assure (type form)
>   (let ((values (copy-symbol 'values)))
>     `(let ((,values (multiple-value-list ,form)))
>        (declare (dynamic-extent values))
>        (etypecase (values-list ,values)
>          (,type (values-list ,values))))))
> 
> …except that this also doesn't work in some Common Lisp implementations for 
> multiple values, but I think it should and those implementations need to be 
> fixed.
> 
> 
> Pascal
> 
> --
> Pascal Costanza
> The views expressed in this email are my own, and not those of my employer.
> 
> 
> 
> 

--
Pascal Costanza
The views expressed in this email are my own, and not those of my employer.



Reply via email to