将函数映射到elisp中的两个列表上

将函数映射到elisp中的两个列表上,lisp,elisp,Lisp,Elisp,在common lisp中,我可以这样做: (mapcar#'cons'(1 2 3)(a b c)) =>((1.A)(2.B)(3.C)) 我如何在elisp中执行相同的操作?当我尝试时,我得到一个错误: (wrong-number-of-arguments mapcar 3) 如果elisp的mapcar一次只能处理一个列表,那么将两个列表合并成一个列表的i自动化方法是什么?您需要mapcar*,它接受一个或多个序列(而不仅仅是普通Lisp中的列表),对于一个序列参数,其工作方式与常规

在common lisp中,我可以这样做:

(mapcar#'cons'(1 2 3)(a b c))
=>((1.A)(2.B)(3.C))
我如何在elisp中执行相同的操作?当我尝试时,我得到一个错误:

(wrong-number-of-arguments mapcar 3)

如果elisp的mapcar一次只能处理一个列表,那么将两个列表合并成一个列表的i自动化方法是什么?

您需要
mapcar*
,它接受一个或多个序列(而不仅仅是普通Lisp中的列表),对于一个序列参数,其工作方式与常规的
mapcar
一样

(mapcar* #'cons '(1 2 3) '(a b c))
((1 . A) (2 . B) (3 . C))
即使没有定义,您也可以轻松推出自己的:

(defun mapcar* (f &rest xs)
  "MAPCAR for multiple sequences"
  (if (not (memq nil xs))
    (cons (apply f (mapcar 'car xs))
      (apply 'mapcar* f (mapcar 'cdr xs)))))
Emacs具有内置功能,它引入了大量常见的Lisp函数和宏,但带有
cl-
前缀。没有理由避免使用此库<代码>cl mapcar是您想要的:

(cl-mapcar '+ '(1 2 3) '(10 20 30)) ; (11 22 33)
使用列表操纵库(请参见),您可以使用(请记住:
-zip With
与应用于2个列表的
cl-mapcar
相同):

我不知道一种优雅的方法来实现3个参数的-zip和等价物。但是您可以使用随
仪表板功能性
软件包提供的
仪表板功能性
(仪表板功能性
的功能要求使用Emacs 24)
-partial
部分应用函数,因此以下两个函数调用是等效的:

(-zip-with '+ '(1 2) '(10 20)) ; (11 22)
(funcall (-partial '-zip-with '+) '(1 2) '(10 20)) ; (11 22)
然后,您可以将其与以下功能一起使用:

(-reduce (-partial '-zip-with '+) '((1 2 3) (10 20 30) (100 200 300))) 
; (111 222 333)
您可以将其包装到带有
&rest
关键字的函数中,因此此函数将接受不同数量的参数,而不是列表:

(defun -map* (&rest lists)
  (-reduce (-partial 'zip-with '+) lists))

因为它是cl MAC的一部分,所以您应该将其称为
cl-mapcar
,并确保
(需要'cl-lib)
(defun -map* (&rest lists)
  (-reduce (-partial 'zip-with '+) lists))