2013-11-08 3 views
-3

Так я получил эту функцию, которая принимает список в качестве аргументаLISP изменить список, передаваемый в качестве аргумента

(defun do-transf (lst) 

...

мой первоначальный LST есть ((NIL NIL) (NIL NIL)) но в конце концов я хочу ПЛС становится

(NIL NIL NIL NIL)

пример

(defvar a (list (list NIL NIL) (list NIL NIL)))

(do-transf a)

(NIL NIL NIL NIL) -> дает правильный ответ, но когда я вызова списка это не будет ответ

((NIL NIL) (NIL NIL)) -> я не хочу этого

+1

Я понимаю, что вы хотите, чтобы это было разрушительным (из комментариев по одному из ответов), но как именно? В первом случае 'a' - это список из двух элементов (каждый из которых равен' (nil nil) ', но назовем их' x' и 'y' на данный момент). Поэтому 'a' is' (x. (Y. Nil)) ', то есть список из двух cons-ячеек, назовем их' xc' и 'yc'. Результатом, который вы хотите, является '(n1. (N2. (N3. (N4. Nil))))' ('n' означает' nil'), который представляет собой список из четырех cons-ячеек. 'xc' и' yc' могут быть использованы повторно, но откуда взялись другие два? –

ответ

2

Ваше сообщение предполагает, что вы хотите сделать список конкатенаций, т. Е. Добавить списки в другой.

Таким образом, попробуйте следующее:

(defvar a (list (list NIL NIL) (list NIL NIL))) 
(apply #'append a) 

Это выводит:

(NIL NIL NIL NIL) 

Короткий, простой, сладкий.

UPDATE:

Так как вы хотите разрушительной поведения (то есть, изменение первоначальной стоимости a):

(setq a (apply #'append a)) 

Теперь a устанавливается на это новое значение (от ((NIL NIL) (NIL NIL))) :

(NIL NIL NIL NIL) 
+0

нет, если вы вызываете a, выходы ((NIL NIL) (NIL NIL)) – user2967111

+0

@ user2967111: Вы хотите ** разрушительное поведение **? То есть, вы хотите изменить 'a'? – jrd1

+0

@ user2967111: Это поведение ** правильно **. Очень немногие функции LISP * когда-либо * требуют изменения значения чего-либо. LISP-способ делать вещи - работать с введенными вами данными, а затем * возвращать * измененные данные. – jrd1

0

Попробуйте использовать flatten ..

(defvar a (flatten (list (list NIL NIL) (list NIL NIL)))) 
+1

Это не главное, я знаю, как идти ((NIL NIL) (NIL NIL)) to (NIL NIL NIL NIL) Я хочу, чтобы список стал тем, что – user2967111

1

Как правило, функции lisp не изменяют данные, на которых они работают. Это не является обязательным свойством, но это значительно упрощает написание и рассуждение о больших базовых кодах.

Итак, что обычно происходит, так это то, что функция вернет копию новых данных, которые затем могут заменить старое значение в переменной, по усмотрению вызывающего.

Даже когда функции разрушают структуры данных, они, как правило, возвращают новое результирующее значение.

Если мы посмотрим на следующий код:

(defvar *example* '(delete 2 3 4)) 
=> *example* 
(delete 'delete *example*) 
=> (2 3 4) 
*example* 
=> (delete 2 3 4) 

Это происходит потому, что нет нет способ для функции с разрушением модифицировать *example* так он теряет первый элемент, так что даже если вы используете разрушительными, мутирующие функции, им нужно вернуть значение, подходящее для сохранения обратно в переменную, из которой поступает вход.

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