为什么 cons 根据 S-expression 的位置给出不同的值

Why cons give a different value based on position of S-expression

所以如果我像这样写一个函数 add1

(define add1 (lambda (n)
                (cons n (quote()) )))

(add1 '(()))

我的答案是 - '((()))

在另一个空列表中添加了一个空列表,不是我想要的答案

但是如果我将函数更改为

(define add1 (lambda (n)
                (cons  (quote()) n )))

先写 quote() 我得到

 '(() ())

这就是我想要的,为什么在第一种情况下反对者在列表中添加了一个列表,而在第二种情况下又在列表旁边添加了一个列表?

(cons 42 (cons 69 (cons 613 '())))(list 42 69 613)

在这里我们使用中级学生语言让我们轻松查看结果。

#lang htdp/isl

(quote ())'()'(())(cons '() '()).

#lang htdp/isl
; Intermediate Student languages

(equal? (quote ()) '())
(equal? '(()) (cons '() '()))

所以我们重写你的函数

#lang htdp/isl
; Intermediate Student languages

(define (f1 x)
  (cons x '()))

(define (f2 x)
  (cons  '() x))

(define a (cons '() '()))

我们知道a = (cons '() '()) = (list '()).

(f1 a) 会做 (cons a '()) 会输出 (list (list '())).

这样想你输入(cons "abc" '())当然会得到(list "abc")。所以 (cons a '()) 会得到 (list a).

(cons '() '())(list '()) 所以当你 运行 (f2 a)。就像 (cons 1 (list 2)) 会得到 (list 1 2)。它只是做 (cons '() (list '()) 所以你会得到 (list '() '()).


想象一下 (list 1 2)(list 3 4)(cons (list 1 2) (list 3 4))

网上有人这样解释list。这真的没有意义。

更好的方法是像二叉树一样绘制list。每个正确的分支必须是 list.