【问题标题】:Functional Programming with Clojure使用 Clojure 进行函数式编程
【发布时间】:2011-10-26 00:09:37
【问题描述】:

大师

这是一个问题:我正在开发一个 clojure 程序, 涉及将函数传递给函数。

我有类似的东西:

(defn funct-op [args]
      ((first args) 
       (second args) 
       (last args)   )

(funct-op '(+ 2 2))

我怎样才能哄 funct-op 给我 4 而不是 2 我是 目前得到?我可能需要将函数传递给宏作为我的 项目进展。关于如何做到这一点的任何提示?感谢您的帮助!

【问题讨论】:

    标签: macros clojure user-defined-functions


    【解决方案1】:

    为了将 '+' 变成一个函数,你可以使用 resolve。这应该适用于核心功能,但您可能需要 ns-resolve 自定义功能。然后,您可以使用 apply 将其余参数传递给该函数。

    (defn funct-add [args] (apply (resolve (first args)) (rest args)))

    不确定您的最终目标到底是什么,但我认为这就是您正在寻找的答案。

    【讨论】:

    • 感谢您的解决方案。对我的最终目标的讨论更适合另一个问题(或者是否允许我嵌套问题)?
    【解决方案2】:

    funct-add真的应该做什么?如果是(funct-add '(- 2 2))呢?

    不管怎样,考虑apply,甚至结束:

    (defn apply-wrapper [args]
       (apply (first args) (rest args)))
    
    ; note use of of the [...] form
    (apply-wrapper [+ 2 2]) ; => 4
    (apply-wrapper [- 2 2]) ; => 0
    

    比较这些形式可能会有所启发:

    (+ 1 2)   ; 3
    '(+ 1 2)  ; (+ 1 2)
    [+ 1 2]   ; [#<core$_PLUS_ clojure.core$_PLUS_@a8bf33> 1 2]
    

    注意最后一个是如何评估的;它不仅仅是一个“字面列表”——那里不再有符号了! :-)

    编码愉快。

    【讨论】:

    • funct-add 应该采用未评估的参数列表,评估它并yield结果。所以(funct-add '(- 2 2)) 将产生 0。一般(funct-add '(binary-op operand1 operand2)),其中 binary-op 可以是 +- 或任何带有两个参数的 运算符 使用前缀表示法。谢谢。
    • @tscala 我认为关键是为什么名称中的“add”不仅仅是 add
    • 还请记住,您不必引用列表来避免评估整个表单。如果您想评估内容,而不是作为函数调用的表单,您可以使用list(list + 1 2)。当然,最好只使用向量。
    • @AdrianMouat 你说得很好。我应该编辑帖子以反映我的目标。谢谢。
    • @Rayne 如果向量 arg 与(funct-add [+ 2 2]) 相同,这不是我要寻找的行为。否则,举个例子?谢谢。
    【解决方案3】:

    我不确定,这些东西?

    (defn funct-op [f list]
      (apply f list))
    
    (funct-op + '(1 2));=>3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-04
      • 2014-10-02
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多