【问题标题】:Memory allocation in LispLisp 中的内存分配
【发布时间】:2011-10-09 03:42:59
【问题描述】:
> (cons 2 3) 
(2 . 3)

Lisp 环境只需要分配一个 cons 单元来连接这两个项目。

以上内容来自 Lisp 书籍《Land of Lisp》。我不明白为什么这对只位于一个缺点单元中。这些数据的内存是什么样的?

【问题讨论】:

    标签: lisp cons land-of-lisp


    【解决方案1】:

    一个 cons 单元格始终包含两个值,称为 carcdr

    +-----+-----+
    | car | cdr |
    +-----+-----+
    

    为了表示一个 cons 单元格,Lisp 有“点符号”:

    (car . cdr)
    

    函数 cons 从它的两个参数创建这样一个 cons 单元:

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

    可以这样想:

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

    cons 单元格的值也可以是指向其他事物的“引用”或“指针”。例如,那些其他东西可以是其他 cons 单元格:

    +-----+-----+     +-----+-----+
    |  1  |   ------->|  2  | nil |
    +-----+-----+     +-----+-----+
    

    这将是点符号的(1 . (2 . nil))。这个链接在 Lisp 中用于表示列表。由于列表用于表示代码,因此它们对于 Lisp 很重要。因此,它们有一个更短的符号:(1 2)

    【讨论】:

      【解决方案2】:

      CONS 单元格是包含两个字段的记录。

      在许多 Lisp 实现中,有针对 cons 单元的特殊优化。一个典型的例子是 fixnum 数字直接存储在字段中 - 没有指针。只要数据适合内存,就可以直接存储。例如,这也可能是字符的情况。也可以存储具有两个字符的 cons 单元格,以便将字符编码到字段中。

      对于其他更大的数据,有指向该数据的指针存储在 cons 单元中。

      那么还要注意两者的区别:

      (cons 1 2)
      

      (list 1 2)
      

      (cons 1 2) 创建单个 cons 单元格。 (list 1 2) 创建两个 cons 单元格。第一个 cons 单元包含 1 和指向第二个的指针。第二个 cons 单元格包含 2 和 NIL(列表结束标记)。

      因此,作为一种优化,通常在键/值对中只使用 cons 单元格而不是列表。

      ((age . 22) (name . "Barbara))
      

      对比

      ((age 22) (name "Barbara"))
      

      后者使用了另外两个 cons 单元格。

      【讨论】:

        【解决方案3】:

        我认为 lisp 的缺点类似于(仅用于解释,不是真正的代码)

        typedef struct _cons
        {
            void* car;
            void* cdr;
        } cons;
        

        这就是“单一缺点”的意思。

        【讨论】:

          【解决方案4】:

          记忆是一种幻觉:

          (define (cons a d)
              (lambda (f) (f a d)))
          
          (define (car x)
              (x (lambda (theCar theCdr) theCar)))
          
          (define (cdr x)
              (x (lambda (theCar theCdr) theCdr)))
          

          看马,不需要内存!

          (开个玩笑)

          【讨论】:

          • 你没看到“开个玩笑”吗?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-11
          • 2014-06-27
          相关资源
          最近更新 更多