Подтвердить что ты не робот

Tuple Unpacking Аналогичен Python, но в Common Lisp

Есть ли способ присвоить значения списка списку символов в Common Lisp, аналогичном тому, как вы можете назначать значения кортежа переменным в Python?

x, y, z = (1, 2, 3)

Что-то вроде

(setq '(n p) '(1 2))

Где n и p теперь равны 1 и 2, соответственно. Выше было то, как я думал об этом в своей голове, но это не работает. Я пробовал использовать следующее:

(apply setq '('(n p) '(1 2)))

Я новичок в Lisp, поэтому, если это что-то явно очевидное, постарайтесь не быть слишком суровым и, пожалуйста, укажите мне в правильном направлении! Спасибо.

PS: Я видел сообщение об этом в Scheme и подобное в расширении кортежа в Common Lisp, но это не очень помогло мне в ответе на мой вопрос 1), потому что я не использую Scheme, и 2), потому что наивысшим ранжированным ответом было просто слово apply.

4b9b3361

Ответ 1

Используйте DESTRUCTURING-BIND, который может сделать целую черту намного больше, чем распаковка кортежа. Подобно назначению по ключевым словам и необязательным параметрам и т.д. Действительно, все, что вы можете сделать с помощью списка параметров функции.

Но если у вас на самом деле нет списка для деструкции и вы хотите сразу установить кучу переменных, используйте PSETF:

(psetf n 1
       p 2)

Вы также можете использовать SETF, но PSETF является более близким аналогом назначения кортежа: он работает, например, для подкачки/перестановки значений.

# Python
n, p = p, n
x, y, z = z, x, y
;; Lisp
(psetf n p
       p n)
(psetf x z
       y x
       z y)

Наверное, вы могли бы уйти с мирским LET.

Кроме того, не беспокойтесь о SETQ для чего-либо. Используйте SETF/PSETF, потому что они лучше, и, кроме того, единственный способ выполнять определенные типы назначений.

Ответ 2

Звучит как destructuring-bind (он внизу) может делать то, что вы хотите.

Кроме того, описание HyperSpec, но я думаю, что другая ссылка демонстрирует его лучше.

(destructuring-bind (x y z) (list 1 2 3) (+ x y z))

Ответ 3

В случае, когда у вас есть список и вы хотите присвоить его значения нескольким переменным, DESTRUCTURING-BIND - это путь.

Однако, для pythonic "верните список или кортеж, используйте список или кортеж переменных для назначения для" case ", он (возможно) lispier, чтобы использовать несколько возвращаемых значений и MULTIPLE-VALUE-BIND.