Page 1 of 1

[Beginner] cdr and list of lists trouble

Posted: Mon Oct 03, 2011 10:43 am
by nikond3s
Hi,

this might be a silly question but I miss something and do not know what it is. I'm using the CLISP interpreter for my "experiments".

Given the list of lists ((a b c) (d e f)) and after applying car/cdr the output looks like the following.

> (car '((a b c) (d e f)))
> (A B C)
> (cdr '((a b c) (d e f)))
> ((D E F))

I'm helpless about the cdr output. Why is it a "list of lists" and not just a single list like the result after applying car?

regards

PS: I hope my english is somehow understandable, it is not my native language. :)

Re: [Beginner] cdr and list of lists trouble

Posted: Mon Oct 03, 2011 10:56 am
by ramarren
nikond3s wrote:Why is it a "list of lists" and not just a single list like the result after applying car?
Why would you expect it to be? CDR when applied to a list gives you a list without the first element of the list. In fact, in Common Lisp it is synonymous with the function REST.

Read something like A Gentle Introduction to Symbolic Computation for more comprehensive explanation of how lists are constructed in Common Lisp.

Re: [Beginner] cdr and list of lists trouble

Posted: Mon Oct 03, 2011 11:31 am
by nikond3s
Ramarren wrote:
nikond3s wrote:Why is it a "list of lists" and not just a single list like the result after applying car?
Why would you expect it to be? CDR when applied to a list gives you a list without the first element of the list.
Why I would expect it to be, is because if I apply "tail" onto a list I'd expect the rest as list and not a list containing the rest, which maybe not accurate. I realized that my understanding of CDR was correct but my understanding of the "cons"-structure wasn't. CDR applied onto a list just points to the next cons-cell on which I need to apply CAR to point to (in my case) the list it contains. I saw it after reading page 47-49 in the book you provided.

Thank you for the book, its very easy to understand. Regards.

Re: [Beginner] cdr and list of lists trouble

Posted: Mon Oct 03, 2011 12:09 pm
by ramarren
nikond3s wrote:Why I would expect it to be, is because if I apply "tail" onto a list I'd expect the rest as list and not a list containing the rest, which maybe not accurate.
Even disregarding the details of conses, you have a list of lists, which means that the inner lists are just elements. Consider, if you had a list of numbers (1 2 3 4 5) then the tail of the list would be (2 3 4 5) which is necessarily a list. In your case there is a single element, which happens to be itself a list, but that doesn't change how CDR works.

Re: [Beginner] cdr and list of lists trouble

Posted: Mon Oct 03, 2011 12:53 pm
by nikond3s
I think I got it now. I saw "too much" which wasn't really there. In my example CAR returns the list it is pointing to, which is the first element of the "parent"-list. CDR returns a list containing the rest where the first element happens to be a list. Thats it nothing special at all. I don't know what took me so long...;).