LISP中的列表评估(缺点的奇怪行为)

Tho*_*rig 2 lisp scheme list cons racket

我目前正在玩LISP.一切都很好,但我无法理解以下问题.

我有这个追加操作:

(define (append l1 l2)
   (if (eq? l1 null)
      l2
      (cons (first l1)
            (myappend (rest l1) l2))))
Run Code Online (Sandbox Code Playgroud)

我这样使用它:

(myappend (cons (cons 1 2) null) '(4 5))
Run Code Online (Sandbox Code Playgroud)

Racket的结果 是:

 '((1 . 2) 4 5)
Run Code Online (Sandbox Code Playgroud)

但为什么?在我的观点中,它应该是'(1 2 4 5),因为cons返回一个列表,myappends附加两个列表.有谁能够帮我?LISP在做什么?

Jim*_*wis 11

cons 返回一个虚线对,不一定是列表.

(cons 1 2) 回报 (1 . 2)

(cons 1 null) 回报 (1)

(cons 1 (cons 2 null)) 回报 (1 2)

  • @Thomas:两个表达式代表相同的结构; 惯例是尽可能使用列表符号而不是点对符号.如果结构中的某个cons单元格中有一个非空原子的cdr(如您的问题所示),则需要使用点对符号,因为该结构不是列表. (4认同)