Как сделать новый список, чтобы указать куда-то еще, Лисп - PullRequest
3 голосов
/ 14 ноября 2009

Название не требует пояснений. Как я могу построить новый список X из другого списка Y (той же структуры), но результирующий список указывает куда-то еще в области памяти, практически, на другой объект? Я пробовал с make-list :initial-element Y или добавлял в пустой список, но все равно получал тот же объект. Спасибо!

Ответы [ 3 ]

12 голосов
/ 14 ноября 2009

Обычный Лисп

Используйте COPY-LIST , чтобы скопировать первый уровень списка.

Используйте COPY-TREE для копирования дерева значений, многоуровневый список будет скопирован на все уровни.

И COPY-TREE, и COPY-LIST будут копировать только содержимое и ничего больше. Вещи в списке остаются неизменными (имеется в виду EQL, а не EQ).

См. Common Lisp HyperSpec Словарь Conses для этих и связанных функций.

3 голосов
/ 14 ноября 2009

Возможно, вы хотите использовать COPY-LIST.

0 голосов
/ 14 ноября 2009

Мой список копирования (с использованием sbcl) сработал.

РЕПЛ:

(defvar a '((1 2 3) (4 5 6)))

(defvar b (copy-tree a))

(setf (nth 0 (nth 0 b)) "4")

a

; ((1 2 3) (4 5 6)) is returned

b

;(("4" 2 3) (4 5 6)) is returned

Возможно, если бы вы дали нам больше источников, мы могли бы помочь.

...