2010-08-03 36 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

相關問題