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.



On Sun, Sep 22, 2013 at 6:53 AM, Pascal Costanza <pc@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 ,@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.