Есть ли способ извлечь все элементы списка на месте? - PullRequest
6 голосов
/ 23 ноября 2011

Я ищу способ извлечь все элементы списка в общий lisp. Как это

[194]> (break-out-of-list '(a b c d))
A
B
C
D

Редактировать: Пример использования, который я привел, был не очень хорошо продуман, однако мне все еще интересно, можно ли вырваться из списка, как в примере выше.

Ответы [ 4 ]

5 голосов
/ 24 ноября 2011

То, что вы демонстрируете, похоже на вопрос, как получить элементы списка в виде нескольких значений :

CL-USER> (values 1 2 3)
1
2
3
CL-USER> (apply #'values '(1 2 3))
1
2
3

См. Также multiple-value-bind и nth-value в гиперспецификации.

2 голосов
/ 30 сентября 2016

Пока работает (apply #'values '(1 2 3)), есть также функция с именем values-list, которая используется следующим образом:

(values-list '(1 2 3))

И она имеет тот же результат.

2 голосов
/ 23 ноября 2011

Конечно, просто используйте apply:

(defun wraptest (&rest arguments)
  (apply #'test arguments))

Технически это не «вырвалось из списка»; он просто использует элементы списка в качестве аргументов для вызова функции.

(Отказ от ответственности: я - Схемер, а не Обычный Лиспер, и может быть более идиоматический способ достижения того же результата в CL.)

1 голос
/ 23 ноября 2011

Я думаю, вы, возможно, ищете это:

http://cl -cookbook.sourceforge.net / macros.html # LtohTOCentry-2

Это в основном все, что нужно для цитаты.Есть только два дополнительных пункта, на которые следует обратить внимание.Во-первых, если вы напишите «, @ e» вместо «, e», тогда значение e будет добавлено в результат.Так что если v = (о, мальчик), то `(zap, @ v, v) оценивается как (зап, мальчик (о мальчик)).Второе вхождение v заменяется его значением.Первый заменяется элементами его стоимости.Если бы v имело значение (), оно бы полностью исчезло: значение (zap, @ v, v) было бы (zap ()), что совпадает с (zap nil).

Чтение ваших комментариев:

(some-macro (break-list '(abcd))) эквивалентно (some-macro' a 'b' c 'd)

С этим вы можете сделать:

`(some-macro ,@'(a b c d))

, и вы получите:

(some-macro a b c d)
...