2016-03-24 53 views
1

我正在为班级做一个与lisp相关的作业,其中一个问题要求我们使用mapcar从列表中“提取”一个项目(这是否意味着他希望我们打印它,或者干脆删除它,我不会“T完全知道,我假设他希望我们打印)从列表中提取项目?

我通常理解使用类似(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通常用于做一些特定于列表中每个项目的东西,而不是单个项目。 (或者,也许我正在理解错误的问题?)

+0

“我通常使用类似于(第3个(列表1 2 3 4))的东西来理解第三个项目” - 我希望它能在您的lisp中返回第四个项目。第n个从0开始,所以(第n个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|) 

探索替代

只使用一个lambda函数什么都不做。它只返回每个项目:

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|)