代码之家  ›  专栏  ›  技术社区  ›  Ryan C. Thompson

简洁的lisp代码,将函数列表全部应用于同一个参数,并获取返回值列表?

  •  9
  • Ryan C. Thompson  · 技术社区  · 15 年前

    假设我有一个元素,我有一个谓词(函数)列表。我想将这些谓词中的每一个应用到单个元素,并得到一个相应的返回值列表。我知道 map 朋友们可以对每一个参数列表应用一个函数,但是有没有简洁的语法可以将多个函数应用于一个参数?

    当然可以

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

    但是,如果有一个功能可以像这样工作,那就太好了:

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

    显然我可以 defun 但我想知道是否有一种公认的方法可以做到这一点。

    1 回复  |  直到 15 年前
        1
  •  9
  •   Rainer Joswig mmmmmm    15 年前

    这个操作并不常见,而且除了直接在公共Lisp中编写它之外,没有真正的预定义方法来执行它。很多人都喜欢一个简短的语法,并添加了一些语法元素,在这种情况下,这些元素可以帮助所有类型的Lisp。在普通的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)