将函数映射到elisp中的两个列表上
在common lisp中,我可以这样做:将函数映射到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中的列表),对于一个序列参数,其工作方式与常规
(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))