Общие вопросы о том, как преобразовать список остальных параметров - PullRequest
3 голосов
/ 14 ноября 2011

Я новичок в распространенном LISP, и поэтому моя проблема может быть очень простой, но я ничего не нашел, возможно, я использовал неправильные условия поиска.

У меня следующая проблема: У меня есть функция, которая делает специальное дополнение на произвольное количество параметров. Следующим шагом будет применение этой функции к произвольному количеству списков одинакового размера, результатом будет список такого размера. это работает, если я позвоню (mapcar #'addition list1 list2 ...) но если мне нужно определить функцию (defun list-add (list &rest lists) (mapcar #'addition list lists)) это не будет работать, потому что & rest lists теперь является списком списков. добавление функции необходимо вызывать со всеми параметрами как последовательность, поэтому рекурсивный вызов невозможен.

у кого-нибудь есть решение?

Ответы [ 3 ]

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

См. APPLY .

Также обратите внимание на значение CALL-ARGUMENTS-LIMIT .

Очевидное решение будет:

(defun list-add (&rest lists)
  (apply #'mapcar #'addition lists))
0 голосов
/ 21 ноября 2011

Я не уверен, что это обязательно лучше или хуже, чем уже предоставленные ответы, но вот что я придумал:

 (defun list-add (first-required-list &rest other-lists)
  (let ((all-lists (cons first-required-list
                         other-lists)))
    (reduce (lambda (left-list right-list)
              (mapcar #'addition left-list right-list))
        all-lists)))
0 голосов
/ 15 ноября 2011

Я не уверен, что правильно понял вопрос, но попробуйте

(defun list-add (list &rest lists)
  (mapcar (lambda (l) (apply #'addition list l))
          lists))
...