Rya*_*son 9 lisp functional-programming list common-lisp sequence
假设我有一个元素,我有一个谓词(函数)列表.我想将这些谓词中的每一个应用于单个元素,并获得相应的返回值列表.我知道这map和朋友可以对每个参数列表应用单个函数,但是有没有简洁的语法将许多函数应用于单个参数?
我当然能做到
(mapcar (lambda (pred) (funcall pred SINGLE-ELEMENT)) LIST-OF-PREDICATES)
Run Code Online (Sandbox Code Playgroud)
但如果有一个功能像以下那样会很好:
(test-predicates-against-element LIST-OF-PREDICATES SINGLE-ELEMENT)
Run Code Online (Sandbox Code Playgroud)
显然我可以defun做到,但我想知道是否有一种可接受的方法来做到这一点.
这个操作并不常见,除了直接在Common Lisp中编写它之外,没有真正的预定义方法.各种各样的人喜欢简短的语法和添加语法元素,这将有助于各种类型的Lisps.在Common Lisp中,人们可能想要编写一个能够执行您想要的功能(而不是添加语法).
(defun fmap (functions &rest args)
(declare (dynamic-extent args))
"Applies each function to the arguments. Returns a list of results."
(mapcar (lambda (function)
(apply function args))
functions))
CL-USER 1 > (fmap (list #'+ #'- #'* #'/) 42 17)
(59 25 714 42/17)
Run Code Online (Sandbox Code Playgroud)