Let's say I have the following list: (A B . D) How I would reproduce this only by using list function ? (list 'A 'B '. 'D) is not working
CodePudding user response:
You cannot. The constructor to create lists are cons
. Proper lists are just the empty list or a chain of one or more cons
where the last one has the empty list as the cdr
. list
only creates proper lists. Eg.
(list 'a 'b 'c)
is a function that does (cons 'a (cons 'b (cons c '())))
.
(a b . d)
is created with (cons 'a (cons 'b 'd))
. It is not a proper list since it is terminated by d
and not nil
. Thus it is impossible to create this structure with list
.
CodePudding user response:
I'm not sure what you are really trying to do here, but this seems to be exactly what
It is then easy to see that there is no value of b
which will result in the cdr of the last cons in such a chain being other than nil
(aka ()
). Therefore lst
, and hence list
, cannot construct a chain of conses in which cdr of the last cons is other than nil
, which means it cannot construct a dotted list, since that is the definition of a dotted list.
CodePudding user response:
We can almost do this with list
, but not quite. The point is that list
insists on putting a nil
at the end of the list, yet we want to have a non-nil
value at the end.
We can therefore have a dotted term anywhere but at the end of the list.
I can offer you:
(list 'a '(b . c) 'd) ; has a normal list end of 'd -> 'nil
(list 'a '(b . c)) ; looks like b . c is at the end, but actually 'a is