我正在为课程做一个与lisp相关的作业,其中一个问题要求我们使用square
从列表中“提取”一个项目(这是否意味着他希望我们打印它,或者只是删除它,我不完全知道,我假设他希望我们打印它。)
我通常理解使用类似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))
指导我如何做到这一点吗?我一直在查找网页链接,似乎mapcar
通常用于对列表中的每个项目执行特定操作,而不是单个项目。 (或者我可能错误地理解了这个问题?)
答案 0 :(得分: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 :(得分: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|)