assert / check-type / assure...
Pascal Costanza
pc at p-cos.net
Sun Sep 22 20:20:40 UTC 2013
On 22 Sep 2013, at 22:18, Scott McKay <swmckay at 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 <pc at p-cos.net> wrote:
>
> On 22 Sep 2013, at 20:45, Steve Haflich <shaflich at 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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/pro/attachments/20130922/32853290/attachment.html>
More information about the pro
mailing list