Lisp, mapcar - можно ли красивше?

Модератор: Модераторы разделов

adav84
Сообщения: 41

Lisp, mapcar - можно ли красивше?

Сообщение adav84 »

Код: Выделить всё

(let ((a 1))
  (mapcar #'(lambda (n)
              (prog1
                  (+ n a)
                (incf a)))
          '(1 2 3)))
=> '(2 4 6)


дело не в том, чтобы прибавить к каждому последующему элементу на единицу больше,
а в том, что ф-я хранит состояние (хотя я (смутно) понимаю, что mapcar не для этого)
но можно ли его хранить где-нибудь в другом месте?

сорри, если сумбурно.

Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Lisp, mapcar - можно ли красивше?

Сообщение watashiwa_daredeska »

adav84 писал(а):
02.04.2012 23:51
можно ли его хранить где-нибудь в другом месте?
Нет. Это классическое замыкание. Если записать как:

Код: Выделить всё

(mapcar
 (let ((a 1))
   #'(lambda (n)
       (prog1
           (+ n a)
         (incf a))))
   input-list)
то получится более явно записанное замыкание.

Вообще же, если речь идет о CL, то он не функциональный, и вполне разумно пользоваться LOOP:

Код: Выделить всё

(loop
   for x in input-list
   for i from 1
   collect (+ x i))
Спасибо сказали: