2016-02-11 1 views
0

В одном функциональном языке Семейство LISP и с возможностью определения переменных,Функциональный язык семьи LISP и один фрагмент кода?

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

создает b список, как

((1 5) 2 3) 

!! Я удивлен. Как эти фрагменты кода составляют этот список? Может ли кто-нибудь объяснить эти запутывающие команды?!

+0

Это не то, что я получаю, когда пытаюсь. 'a' is' (1 5) ',' b' is '((1 5) 2 3)'. – Barmar

+1

BTW, Lisp обычно не считается функциональным языком. – Barmar

+0

@ Бармар, вы правы. Я исправляю это. – user4249446

ответ

4

После выполнения первых двух вызовов defvar у вас есть следующие переменные назначения для conses.

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

В печатном представлении это выглядит следующим образом:

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

При выполнении rplacd, он изменяет cdr из a сослаться на новый cons. Но cdrb по-прежнему относится к тому же cons, как и раньше.

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

В печатной форме это выглядит следующим образом:

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

Важно, чтобы понять о Лиспе заданий является то, что они не делают копии структуры списка, они просто присвоить ссылки на conses (если вы знакомы с такими языками, как C, это все как указатель на struct).

+0

после первой команды мы имеем a = (1 2 3), после следующего мы имеем b = ((1 2 3) 2 3), до сих пор? – user4249446

+0

Это правильно. – Barmar

+0

, если мы не думали как указатель, мы говорим после последней команды a = (1,5) и b = ((1 2 3) 2 3), что было неправильно. Окей? – user4249446

Смежные вопросы