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.