Subject: Re: destructuring-bind on infinite lists?
From: rpw3@rpw3.org (Rob Warnock)
Date: Sun, 26 Feb 2006 19:19:00 -0600
Newsgroups: comp.lang.lisp
Message-ID: <mtOdnfrkXYwZzp_ZnZ2dnUVZ_vydnZ2d@speakeasy.net>
Kaz Kylheku <kkylheku@gmail.com> wrote:
+---------------
| Pascal Bourguignon wrote:
| > "Kaz Kylheku" <kkylheku@gmail.com> writes:
| > > This should be allowed:
| > >   (destructuring-bind (() a b c) (list 1 2 3 4))
| > > The 1 in the data is matched by () which is the atom NIL, of course.
| > > Atom against atom is valid!
| > > Wouldn't you know it, this fails on CLISP! Should it?
| >
| > IMO, yes.
| 
| Why?
+---------------

Maybe because LISTP trumps SYMBOLP in the patterns?

CMUCL also barfs on that example, *not* because of the NIL in the
template, but because:

    Error while parsing arguments to DESTRUCTURING-BIND in "Top-Level Form":
    Bogus sublist:
      1
    to satisfy lambda-list:
      ()

However, if you feed CMUCL *this* it works just fine:

    > (destructuring-bind (() a b c) (list () 2 3 4) (+ a b c))

    9
    > 

Note: An old version of CLISP (2.29) also barfs on the latter,
with the message:

    *** - LET*: NIL is a constant, cannot be bound

I don't know what current versions give.


-Rob

-----
Rob Warnock			<rpw3@rpw3.org>
627 26th Avenue			<URL:http://rpw3.org/>
San Mateo, CA 94403		(650)572-2607