mapcar与lambda和两个列表作为输入

时间:2016-10-27 01:47:16

标签: list lambda common-lisp

首先,我想了解以下代码中的差异,如果有的话:

  1 (setf list1 '(1 2 3))
  2 (setf list2 '(10 100))
  3 
  4 (defun som(x y )
  5         (* x y))
  6 
  7 
  8 (print(mapcar #'(lambda(x)x)  list1))
  9 (print (mapcar #'(lambda(x)x)  list1))

返回以下内容:

(1 2 3) 
(1 2 3) 

然后我想了解如何执行以下操作:

(setf list1 '(1 2 3))
(setf list2 '(10 100))
(mapcar '#+ x y)

为了获得以下内容: ((11 101)(12 102)(13 103)),这是,添加第一个列表的第一项 到第二个列表中的每个项目。 当然,我可以非常快速地定义一个函数,该函数将迭代列表并将mapcar应用于列表。我想知道是否有任何基元可以做到这一点。

谢谢,祝你晚安

1 个答案:

答案 0 :(得分:0)

您的代码

(setf list1 '(1 2 3))
(setf list2 '(10 100))

(defun som(x y )
        (* x y))


(print(mapcar #'(lambda(x)x)  list1))
(print (mapcar #'(lambda(x)x)  list1))

;;在不需要空间的表单之间也是如此 ;;但是使用spca和标签来编写东西更具可重复性

所以这就是我如何编写表达式

(print (mapcar #'(lambda (x) x)  list1))

或者您可以使用功能标识

(print (mapcar #'identity list1))

总是记得表单的第一个元素是评估者的函数

要理解这一点,你需要全面了解lambda表达式和lisp中的map函数,这对于学习函数式编程也很有用,在这种情况下,你将尽可能快地编写迭代版本

你会有其他的aproches,这不是我喜欢的一个因为全局变量的使用,但它应该做得很厚,总是记住我的迭代版本

(defparameter *list1* '(1 2 3))
(defparameter *list2* '(10 100))

(print (mapcar (lambda (x) (mapcar (lambda (y) (+ x y)) *list2*)) *list1*))