首先,我想了解以下代码中的差异,如果有的话:
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应用于列表。我想知道是否有任何基元可以做到这一点。
谢谢,祝你晚安
答案 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*))