简体   繁体   中英

List evaluation in LISP (strange behaviour of cons)

I am currently playing around with LISP. Everything is fine, but I can't understand the following issue.

I have the this append-operation:

(define (append l1 l2)
   (if (eq? l1 null)
      l2
      (cons (first l1)
            (myappend (rest l1) l2))))

I use it like this:

(myappend (cons (cons 1 2) null) '(4 5))

And the result in Racket is:

 '((1 . 2) 4 5)

But why? In my oppinion it should be '(1 2 4 5) , because cons returns a list and myappends appends two lists. Can anybody help me? What is LISP doing?

cons returns a dotted pair, not necessarily a list.

(cons 1 2) returns (1. 2)

(cons 1 null) returns (1)

(cons 1 (cons 2 null)) returns (1 2)

A (cons 1 2) will return an object whose first pointer ( car ) points to 1, and the other ( cdr ) points to 2, that's why it get printed in the dot-pair fashion.

Also you may want to understand deeper, I will recommend you read the CL: gentle introduction to symbolic computation , "6.4. Comparing CONS, LIST, AND APPEND", which explained these topics really well.

Try what (cons 1 2) returns. Is it a list?

to @ThomasUhrig: the following info might help you.

Although we are talking about Lisp language here, I notice that a line from Page 8 and 9 of a famous Book named "The Little Schemer (4th edition)" help me understand the 2 puzzling facts altogether:

    Why (cons 1    2) does not look like '(1 2)?
    Why (cons 1 '(2)) does     look like '(1 2)?
    ----
    > (cons 1 2)
    (1 . 2)
    > (cons 1 '(2))
    (1 2)
    > '(1 2)
    (1 2)

Just read the "The Laws of Cons" :

The primitive cons takes 2 arguments.

The 2nd argument to cons must be a list.

The result is a list.

In practice: ( cons AB) works for all values A and B , And

( car ( cons AB)) = A

( cdr ( cons AB)) = B

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM