2016-03-24 3 views
1

Я выполняю связанное с lisp назначение для класса, и одна из проблем требует от нас использовать mapcar для «извлечения» элемента из списка (означает ли это, что он хочет, чтобы мы его распечатали или просто удалили, Не знаю полностью, я предполагаю, что он хотел бы, чтобы мы его распечатали.)Извлечение элемента из списка списков?

Я вообще понимаю, используя что-то вроде (nth 3 (list 1 2 3 4)), чтобы получить третий элемент из списка, но с использованием mapcar это кажется слишком сложным - особенно когда данные, которые он хочет нам проверить (он хочет, чтобы мы извлекли номера социального страхования):

((olsen jimmy 123-76-4535 cub-reporter) 
(kent clark 089-52-6787 reporter) 
(lane lois 951-26-1438 reporter) 
(white perry 355-16-7439 editor)) 

Может ли кто-нибудь вести меня по h ow именно для этого, используя mapcar? Я искал веб-ссылки на нем, и кажется, что mapcar обычно используется для создания чего-то определенного для элемента EACH в списке, а не для одного элемента. (Или, может быть, я понимаю проблему не так?)

+0

«Я вообще понимаю, что использовал что-то вроде (nth 3 (list 1 2 3 4)), чтобы получить третий элемент» - я надеюсь, что он вернет четвертый в вашем lisp. nth начинается с 0, поэтому (nth 0 '(1 2 3 4)) вернет 1. – kennytilton

ответ

1

Мне действительно удалось разобраться - это было удивительно просто, все, что вам действительно нужно было делать «третье» в списке предметов. Мой итоговый код:

(setf daily-planet 
    '((olsen jimmy 123-76-4535 cub-reporter) 
     (kent clark 089-52-6787 reporter) 
     (lane lois 951-26-1438 reporter) 
     (white perry 355-16-7439 editor))) 

(mapcar #'third daily-planet) 

И это сработало!

1
CL-USER 26 > (setf daily-planet 
        '((olsen jimmy 123-76-4535 cub-reporter) 
        (kent clark 089-52-6787 reporter) 
        (lane lois 951-26-1438 reporter) 
        (white perry 355-16-7439 editor))) 

((OLSEN JIMMY |123-76-4535| CUB-REPORTER) (KENT CLARK |089-52-6787| REPORTER) 
(LANE LOIS |951-26-1438| REPORTER) (WHITE PERRY |355-16-7439| EDITOR)) 

Ваше решение:

CL-USER 27 > (mapcar #'third daily-planet) 

(|123-76-4535| |089-52-6787| |951-26-1438| |355-16-7439|) 

Изучение альтернатив

Просто с помощью функции лямбда ничего не делать. Она возвращает только каждый элемент:

CL-USER 28 > (mapcar #'(lambda (x) 
         x) 
        daily-planet) 

((OLSEN JIMMY |123-76-4535| CUB-REPORTER) (KENT CLARK |089-52-6787| REPORTER) 
(LANE LOIS |951-26-1438| REPORTER) (WHITE PERRY |355-16-7439| EDITOR)) 

Теперь, используя third для доступа к третьему элементу каждого подсписка:

CL-USER 29 > (mapcar #'(lambda (x) 
         (third x)) 
        daily-planet) 

(|123-76-4535| |089-52-6787| |951-26-1438| |355-16-7439|) 

Теперь, используя NTH для доступа к третьему элементу каждого подсписка:

CL-USER 30 > (mapcar #'(lambda (x) 
         (nth 2 x)) 
        daily-planet) 

(|123-76-4535| |089-52-6787| |951-26-1438| |355-16-7439|) 
Смежные вопросы