【问题标题】:Functional Language Family of LISP and one Code Fragment?LISP 的函数式语言系列和一个代码片段?
【发布时间】:2016-05-22 21:54:14
【问题描述】:

在 LISP 的一个函数式语言家族中,并且可以定义变量,

(defvar a '(1 2 3))
(defvar b (cons a (cdr a)))
(rplacd a '(5))

b 列表创建为

((1 5) 2 3)

!!我很惊讶。这些代码片段是如何列出这个列表的?谁能解释这些令人困惑的命令?!

【问题讨论】:

  • 这不是我尝试时得到的。 a(1 5)b((1 5) 2 3)
  • 顺便说一句,Lisp 通常不被认为是一种函数式语言。
  • @Barmar 你是对的。我纠正它。
  • 您能帮我添加更多细节吗? @Barmar
  • 用盒子和指针表示所有的conses来绘制列表,你应该明白为什么会这样了。

标签: list functional-programming lisp


【解决方案1】:

在您执行前两个 defvar 调用后,您有以下变量分配给 conses。

A => +---+---+  +---+---+  +---+---+      
+--> | 1 | ---->| 2   ---->| 3 | ----> NIL
 \   +---+---+  +---+---+  +---+---+
  \            --^
   \          /   
    \        /                        
     \      /                        
      \    /      
B => +-\-+-|-+    
     | | | | |    
     +---+---+

在印刷表示中,这看起来像:

A => (1 2 3)
B => ((1 2 3) 2 3)

当您执行rplacd 时,它会修改acdr 以引用新的cons。但是bcdr 仍然指代相同的cons

               +---+---+
             ->| 5 | ----> NIL
            /  +---+---+     
           /
A => +---+-|-+  +---+---+  +---+---+      
+--> | 1 | | |  | 2   ---->| 3 | ----> NIL
 \   +---+---+  +---+---+  +---+---+
  \            --^
   \          /   
    \        /                        
     \      /                        
      \    /      
B => +-\-+-|-+    
     | | | | |    
     +---+---+

打印出来的样子是这样的:

A => (1 5)
B => ((1 5) 2 3)

了解 Lisp 赋值的重要一点是,它们不会复制列表结构,它们只是分配对 conses 的引用(如果您熟悉像 C 这样的语言,就好像一切都是指向struct)。

【讨论】:

  • 在第一个命令之后我们有 a= (1 2 3),在下一个命令之后我们有 b= ((1 2 3) 2 3),我到现在为止了吗?
  • 如果我们不认为是指针,我们在最后一个命令 a=(1,5) 和 b=((1 2 3) 2 3) 之后说这是错误的。好吗?
  • 这就是为什么您需要跟踪关系中涉及的具体问题。
  • 设置(defvar b (cons a (cdr a))时不会进行复制。 b 所指的 cons 指的是 a 指向的一些相同的 cons 单元格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 2014-02-06
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
相关资源
最近更新 更多