Common Lisp 相当于 Python 的 itertools.starmap?

J. *_*ini 7 python common-lisp python-itertools starmap

Python 的 Itertools 有所谓的starmap. 给定一个集合和一个函数,它将函数严格应用于集合内部的每个集合,并使用所述内部集合的元素作为函数的参数。例如,

\n
from itertools import starmap\n\xc2\xa0\nNestedList = [(1, 2), (3, 4), (5, 6), (0, 0), (1, 1), (2, 2)]\n\nlist(starmap(lambda x, y:x + y, NestedList))\n
Run Code Online (Sandbox Code Playgroud)\n

返回包含 3、7、11、0、2 和 4 的列表。

\n

我不相信 Python 是第一个提出这个概念的人,但当我试图思考它在旧语言中的名称时,我却一片空白。Common Lisp 中是否存在类似的功能?我确信确实如此,但我无法命名。

\n

Mar*_*ůda 7

mapcar使用和的组合apply

(defun starmap (f list)
  (mapcar (lambda (x) (apply f x)) list))
Run Code Online (Sandbox Code Playgroud)

或者loop使用关键字collect

(defun starmap (f list)
  (loop for x in list 
        collect (apply f x)))
Run Code Online (Sandbox Code Playgroud)

例子:

> (starmap (lambda (x y) (+ x y)) '((1 2) (3 4) (5 6) (0 0) (1 1) (2 2)))
(3 7 11 0 2 4)

> (starmap #'expt '((1 2) (3 4) (5 6) (0 0) (1 1) (2 2)))
(1 81 15625 1 1 4)
Run Code Online (Sandbox Code Playgroud)


cor*_*ump 6

\n

我不相信 Python 是第一个提出这个概念的人,但当我试图思考它在旧语言中的名称时,我却一片空白。[...]我确信确实如此,但我无法命名。

\n
\n

为了解决这个特定问题,请考虑 Lispers 或更一般的函数式程序员会说:“函数mapapply。\n因此,一个自然的名称将是mapply

\n

通过查找该名称,您可以看到确实有像Serapeum这样的库定义了它,而且还可以看到 1992 年以来对该函数的较旧引用(具有相同的含义)(H. Baker:Look\'Lively Linear Lisp \ xe2\x80\x94 \'看,妈,没有垃圾!\'),也可能在那之前。

\n

事实上,Python 使用与解释其名称*相同的方式来扩展值列表。applystarmap

\n