2010-08-03 40 views
9

假设我有一个单一的元素,并且我有一个谓词(函数)列表。我想将这些谓词应用到单个元素并获取相应的返回值列表。我知道map和朋友可以对每个参数列表应用单个函数,但是是否有任何简洁的语法将多个函数应用于单个参数?Concise Lisp代码将所有函数列表应用于相同的参数并获取返回值的列表?

我当然可以做

(mapcar (lambda (pred) (funcall pred SINGLE-ELEMENT)) LIST-OF-PREDICATES) 

但如果是工作就像一个功能,这将是很好:

(test-predicates-against-element LIST-OF-PREDICATES SINGLE-ELEMENT) 

很显然,我可以只defun,但我想知道有一个公认的方法来做到这一点。

回答

9

此操作并不常见,并没有真正的预定方式做到这一点,不是直接写它,在Common Lisp的其他。不同的人喜欢简短的语法,并添加了语法元素,这些元素可以帮助这种情况下的各种Lisp。在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) 
+0

我不明白CLHS对DYNAMIC-EXTENT有什么意见。该条目说,作为一个例子,一个实现可以选择堆栈分配这样声明的变量,并且显示堆栈分配defun的参数可能没有用。它在这里工作,因为参数是一个列表(所以已知大小)? – 2010-08-04 12:23:53

+1

args是一个列表。此列表仅用于该函数内部,并未返回。因此,动态范围。如果支持,列表可以分配堆栈。从该功能返回后,该列表将被销毁,因此不需要GC时间。 – 2010-08-04 12:31:31

相关问题