<div dir="ltr">ccl has a function (not a macro) called require-type, as in<br> (1+ (require-type x 'number)).  Very useful indeed.<br><br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Sep 22, 2013 at 9:53 AM, Pascal Costanza <span dir="ltr"><<a href="mailto:pc@p-cos.net" target="_blank">pc@p-cos.net</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
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.<br>
<br>
ASSURE is easy to define:<br>
<br>
(defmacro assure (type form)<br>
  (let ((object (copy-symbol 'object)))<br>
    `(let ((,object ,form))<br>
       (check-type ,object ,type)<br>
       ,object)))<br>
<br>
The important difference is that the value of form is returned, which allows using ASSURE inline in expressions:<br>
<br>
(1+ (assure number x))<br>
<br>
…in place of the more lengthy:<br>
<br>
(progn<br>
  (check-type x number)<br>
  (1+ x))<br>
<br>
Is ASSURE, or something similar, part of any utility library, like Alexandria or the likes?<br>
<br>
On an unrelated note, I recently came up with the following utility macro which I found very useful:<br>
<br>
(defmacro assocf (item alist &optional default &rest keys &key test test-not key)<br>
  (declare (ignore test test-not key))<br>
  (let ((it (copy-symbol 'it)) (cons (copy-symbol 'cons)))<br>
    `(let* ((,it ,item) (,cons (assoc ,it ,alist ,@keys)))<br>
       (unless ,cons<br>
         (setf ,cons (cons ,it ,default)<br>
               ,alist (cons ,cons ,alist)))<br>
       ,cons)))<br>
<br>
Again, is something like this already part of some utility library?<br>
<br>
<br>
Thanks,<br>
Pascal<br>
<br>
--<br>
Pascal Costanza<br>
The views expressed in this email are my own, and not those of my employer.<br>
<br>
<br>
<br>
<br>
</blockquote></div><br></div>