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