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
.
Ответы
Ответ 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.