【问题标题】:mapcar with lambda and two list as input带有 lambda 和两个列表作为输入的 mapcar
【发布时间】:2016-10-27 01:47:15
【问题描述】:

首先,我想了解以下代码中的区别(如果有的话):

  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)),这是,添加第一个列表的第一项 到第二个列表的每个项目。 当然,我可以非常快速地定义一个函数,该函数将遍历列表并将地图车应用于列表。我想知道是否有任何原语可以做到这一点。

谢谢,晚安

【问题讨论】:

标签: list lambda common-lisp


【解决方案1】:

你的代码

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

;;这在您不需要空间的表单之间是相同的 ;;但是用spcaes和tabs写东西更易读

这就是我要写的表达式

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

或者你可以使用函数标识

(print (mapcar #'identity list1))

永远记住表单的第一个元素是评估者的函数

要理解这一点,您需要全面了解 lisp 中的 lambda 表达式和映射函数,这对于学习函数式编程也很有用,在这种情况下,您将像编写迭代版本一样快速编写它

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

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

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

【讨论】:

  • 谢谢,我离得这么近,去(mapcar(mapcar lambda))忘记了我需要另一个 lambda。最终我走了另一条路:(mapcar #'(lambda (x) (funcall #'fun x y))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多