【问题标题】:Difference between two cons两个缺点之间的区别
【发布时间】:2021-05-25 22:42:09
【问题描述】:

cons 在以下两项上的工作方式有什么区别:

(cons 1 '(2))
; (1 2)
(cons 1 2)
; (1 . 2)

两者都将 pair? 评估为 true,所以我很好奇两者有何不同。

一个生产:

 --------
| 1 | 2 | 
 -------

另一个产生:

 --------        --------
| 1 | -> |       | 2 | X |  
 -------         -------

或者有什么区别?

【问题讨论】:

  • 是的,正确...
  • 如果您使用的是 Racket,您可能需要查看sdraw,它会生成图片来展示您的不同。
  • 是的,但顺序相反。第一张图片与最后一个代码sn-p一起使用。 (只是为了让任何旁观者都超级清楚)

标签: scheme lisp sicp cons


【解决方案1】:

cons 在这两种情况下的工作方式没有区别。

cons 是一样的。由cons 生成的任何内容都会导致pair? 返回true。就这么简单。

cons在一起的两个东西在两个代码sn-ps之间是不同的。

在第二个 sn-p 中,(cons 1 2),是两个数字。避开任何对表示效率的倾向,只对概念正确性感兴趣,我们认为它是创造

        ---------
        | * | * |
        ---------
          |   |
          v   v
          1   2

第一个 sn-p,(cons 1 '(2)),使用一个数字 1 和一个由 '(2) 创建的对象:

        ---------
        | * | * |
        ---------
          |   |
          v   v
          1   ---------
              | * | * |
              ---------
                |   |
                v   v
                2   NIL

【讨论】:

    【解决方案2】:

    你需要了解一个 proper 列表是如何在 Scheme 中定义的。正确的列表由consing 元素创建,其中cdr 部分是另一个cons 单元格或空列表'()。问题中的第一个例子是一个正确的列表:

    (cons 1 '(2))
    (cons 1 (cons 2 '())) ; this is the same as above
    => '(1 2)
    

    当然,我们也可以创建不遵守规则的任意cons 单元格。问题中的第二个示例证明了这一点,它是一个 cons 单元格,其中 cdr 部分不是另一个 cons 单元格或空列表,因此它不是一个正确的列表:

    (cons 1 2)
    => '(1 . 2)
    

    【讨论】:

      【解决方案3】:

      正确的列表总是以 NIL 结束。即,第一个代码示例产生两个 cons-cells,一个在另一个中,最里面的是 nil-terminated。然而,第二个示例不遵循标准列表的规则,因为它只是一个带有两个非 nil 值的单个 cons-cell。

      (cons 1 '(2)) 
      CLISP> (1 2) ; This list is actually (cons 1 (cons 2 NIL))
      
      (cons 1 (cons 2 NIL))
      CLISP> (1 2) ; Same as above
      

      但是,如果您将 NIL 排除在外,REPL 将用一个点表示。

      (cons 1 2) ; this cons-cell is not terminated by NIL
      CLISP> (1 . 2)
      
      (cons 1 (cons 2 (cons 3 4))) ; A longer example
      CLISP> (1 2 3 . 4) ; Notice the dot to indicate last element is non-nil.
      

      【讨论】:

        猜你喜欢
        • 2011-11-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多