LISP中nil和(nil)之间的差异

时间:2017-09-10 17:23:45

标签: common-lisp

我刚刚开始学习LISP,并试图解决以下问题: (我已经尝试解决这个问题,直到我得到这个疑问并陷入困境)

原始清单:((b c)(r p))

在此列表上执行以下操作并输出结果:

  1. CDR - ((r p))
  2. CADR - (r p)
  3. CDADR - (p)
  4. CDDADR - 这个操作是答案(零)还是零? 应该是(NIL),因为它表示一个空列表?作为' D'从列表中提取除第一个元素之外的所有元素。或者nil和(nil)之间没有区别
  5. 谢谢!

2 个答案:

答案 0 :(得分:3)

关于NIL/(NIL)

  • NIL是一个自我评估的符号(symbol-value本身就是其中一个符号)。所有在布尔值上运行的函数都将此符号识别为 false 。对序列或缺点单元进行操作的所有函数都将此符号识别为空列表。实际上,nil用于其他上下文(格式等),您可以定义自己的函数,其中nil可能意味着什么(按照惯例,它通常意味着“空”,“零“,”未定义“,......)。评估(list)会返回nil

  • (NIL)是一个元素的列表NIL

    可以通过评估(cons nil nil)(list nil)来获取。如果您对其应用length,则会返回1.

当您阅读此表单时:

((b c)(r p))

...你获得了与这个结构相同的结构:

((b . (c . nil)) . ((r . (p . nil)) . nil))

...这也与评估的结构相同:

(cons ;; CAR
      (cons ;; CAAR
            'b
            ;; CDAR
            (cons 'c
                  nil))
      ;; CDR
      (cons (cons 'r
                  (cons 'p
                        nil))
            nil))

然后,请记住:

(CADR X) = (CAR (CDR X))

...并相应地遵循每个利弊细胞。例如:

(CDADR X) = (CDR (CAR (CDR X)))

您从里到外进行评估并对​​其先前的结果应用每个函数,该结果将从根元素开始相应地下降到缺点单元格的树中。 换句话说,从根元素开始,下降到CDR,获取结果的CAR,等等。我会让你这样做。结果既不是(NIL)也不是NIL

答案 1 :(得分:1)

你的例子错了:

列表:((b c) (r p))

Operation  your example    actual result

CDR        ((r p))         ((r p))
CADR       r               (r p)
CDADR      (nil) or nil    (p)