assert / check-type / assure...
Faré
fahree at gmail.com
Sun Sep 22 17:19:34 UTC 2013
See fare-utils:define-values-modify-macro
(defmacro define-values-modify-macro (name val-vars lambda-list function)
"Multiple-values variant on define-modify macro, by Tim Moore"
(let ((env (gensym "ENV")))
`(defmacro ,name (, at val-vars , at lambda-list &environment ,env)
(multiple-value-bind (vars vals store-vars writer-form reader-form)
(get-setf-expansion `(values ,, at val-vars) ,env)
(let ((val-temps (mapcar #'(lambda (temp) (gensym (symbol-name temp)))
',val-vars)))
`(let* (,@(mapcar #'list vars vals)
, at store-vars)
(multiple-value-bind ,val-temps ,reader-form
(multiple-value-setq ,store-vars
(,',function , at val-temps ,, at lambda-list)))
,writer-form
(values , at store-vars)))))))
—♯ƒ • François-René ÐVB Rideau •Reflection&Cybernethics• http://fare.tunes.org
On Sun, Sep 22, 2013 at 1:15 PM, Pascal Costanza <pc at p-cos.net> wrote:
>
> On 22 Sep 2013, at 18:44, Steve Haflich <shaflich at gmail.com> wrote:
>
> As language lawyer, I must point out that the proposed definition of assure
> is not compatible with places that are multiple-valued. check-type is
> required to be (because the ANS mentions no exception about it) although I'm
> sure lots of implementations get this wrong.
>
>
> Another good point. However, this seems to suggest that it's not possible to
> implement ASSURE portably if the goal is to cover multiple values as well.
> Or am I missing something?
>
> Pascal
>
> On Sun, Sep 22, 2013 at 6:53 AM, Pascal Costanza <pc at p-cos.net> wrote:
>>
>> Hi,
>>
>> It seems to me that ASSERT and CHECK-TYPE are not as convenient as they
>> could be. In particular, ISLISP seems to have a better alternative in
>> ASSURE.
>>
>> ASSURE is easy to define:
>>
>> (defmacro assure (type form)
>> (let ((object (copy-symbol 'object)))
>> `(let ((,object ,form))
>> (check-type ,object ,type)
>> ,object)))
>>
>> The important difference is that the value of form is returned, which
>> allows using ASSURE inline in expressions:
>>
>> (1+ (assure number x))
>>
>> …in place of the more lengthy:
>>
>> (progn
>> (check-type x number)
>> (1+ x))
>>
>> Is ASSURE, or something similar, part of any utility library, like
>> Alexandria or the likes?
>>
>> On an unrelated note, I recently came up with the following utility macro
>> which I found very useful:
>>
>> (defmacro assocf (item alist &optional default &rest keys &key test
>> test-not key)
>> (declare (ignore test test-not key))
>> (let ((it (copy-symbol 'it)) (cons (copy-symbol 'cons)))
>> `(let* ((,it ,item) (,cons (assoc ,it ,alist , at keys)))
>> (unless ,cons
>> (setf ,cons (cons ,it ,default)
>> ,alist (cons ,cons ,alist)))
>> ,cons)))
>>
>> Again, is something like this already part of some utility library?
>>
>>
>> Thanks,
>> 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.
>
>
>
More information about the pro
mailing list