tags:

views:

241

answers:

3

What's the difference between:

(cons 'a (cons 'b 'c)) ;; (A B . C)

and

(cons 'a '(b.c)) ;; (A B.C)

I need to create the following list ((a.b).c) using cons so i'm trying to understand what that "." represents.

L.E.: I have the following (cons (cons 'a 'b) 'c) but it produces ((A . B) . C) and not ((A.B).C) (Note the extra spaces)

+5  A: 

. between two characters is a part of a symbol. b.c is a symbol with a name of three characters: b, ., and c.

If you enter FOO.BAR, then Lisp will read it as one symbol.

If you enter (FOO.BAR) then Lisp will read it as a list with one symbol as its contents.

If you enter (FOO . BAR) then Lisp will read it as a cons cell with FOO as the CAR and BAR as the CDR.

. is used to separate the CAR and the CDR of a cons cell: (a . b). Note the space around ..

(cons 'b 'c) creates a cons cell with the symbol b as the car and the symbol c as the cdr. It is written as (b . c).

(cons 'a '(b.c)) creates a list of two symbols, a and b.c. It is written as (a b.c) .

((A.B).C) is always printed as ((A.B) . C) . It is also not a list. ((a.b) . c) is a cons cell with the list (a.b) as the CAR and the symbol C as the CDR.

Rainer Joswig
+1  A: 

If this is in the course of learning lisp, the question probably did not meant an implied "no space allowed" rule, as spaces are not significant against parenthesis, and the correct answer is the one you gave.

In particular, the space after a closing parenthesis is always added, but it's for human readability purpose only. It does not make any sense to require it not to be printed.

Jerome
+6  A: 

Spaces are used to separate list tokens. A.B is a single token. (A.B) is a list with a single element. (A . B) is a cons cell with A as car and B as cdr.

A cons cell is a pair of "things" (objects). In your case, these things are symbols, and they are named A, B, etc.. The printed representation of such a cell is (A . B), for example. This is called "dot notation". The first element is called "car", the second "cdr".

The function cons creates such a cell. (cons 'a 'b) thus produces the cell (A . B). Note that names are always upcased internally.

This is most likely what your teacher wanted, so ((A . B) . C) is the correct output, and your code the right answer. This is a cell where the car points to another cell, and the cdr contains C. That other cell is a cell where the car contains A and the cdr B.

By the way, a list is a linear chain of such cons cells, such that the car always holds a value and the cdr points to the rest of the list. The last cdr points nowhere (which is called NIL in Lisp). In dot notation, a list is e.g. (A . (B . (C . NIL))). Since lists are important, they can be written shorter like this: (A B C). If the last CDR has a value instead of NIL, it is shown in dot notation, e.g. (A . (B . (C . D)))) can be written as (A B C . D).

Svante