strange error with mapcan and quote.

Discussion of Common Lisp

strange error with mapcan and quote.

Postby stackman » Sat Oct 20, 2012 1:54 pm

I get a weird behavior with sbcl when I try the following code at the repl.
Code: Select all
 (mapcan (lambda (x) (if (evenp x) '(even))) (list 1 2 3 4))

Sbcl hangs at 100% CPU without returning an error.

Why do I get such a behavior?
Apparently, this is related to the quote '(even).
If I replace it by (list 'even), I get the expected answer (EVEN EVEN).

As far as I understand from the spec, the mapcan call should be equivalent to
Code: Select all
(apply #'nconc (mapcar (lambda (x) (if (evenp x) '(even))) (list 1 2 3 4)))

but then this code gives a heap exhaustion. I am puzzled.
stackman
 
Posts: 28
Joined: Sat Oct 06, 2012 5:44 am

Re: strange error with mapcan and quote.

Postby Konfusius » Sat Oct 20, 2012 2:06 pm

Mapcan operates destructively on the lists returned by the function. Because your function returns a literal list mapcan operates destructively on a literal object. The error will go away if you replace '(even) by (list 'even).
Konfusius
 
Posts: 62
Joined: Fri Jun 10, 2011 6:38 am


Return to Common Lisp

Who is online

Users browsing this forum: Google [Bot] and 2 guests