Macros 用Clojure进行函数式编程

Macros 用Clojure进行函数式编程,macros,clojure,user-defined-functions,Macros,Clojure,User Defined Functions,大师 这里有一个问题要问你:我正在做一个clojure项目 涉及将函数传递给函数 我有点像: (defn funct-op [args] ((first args) (second args) (last args) ) (funct-op '(+ 2 2)) 我怎样才能哄骗函数op给我4而不是2我是谁 现在得到了什么?我可能需要将函数传递给宏作为我的 项目进展。有什么建议吗?谢谢你的帮助 功能添加真正应该做什么?如果它是(funct add'

大师

这里有一个问题要问你:我正在做一个clojure项目 涉及将函数传递给函数

我有点像:

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

(funct-op '(+ 2 2))
我怎样才能哄骗函数op给我4而不是2我是谁 现在得到了什么?我可能需要将函数传递给宏作为我的
项目进展。有什么建议吗?谢谢你的帮助

功能添加真正应该做什么?如果它是
(funct add'(-2))

无论如何,考虑一下,甚至包起来:

(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]
(+12);3.
'(+ 1 2)  ; (+ 1 2)
[+ 1 2]   ; [# 1 2]
注意最后一个是如何评估的;它不仅仅是一个“文字列表”——不再有符号了!:-)


愉快的编码。

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

(定义函数添加[args](应用(解析(第一个args))(其余args)))


我不确定你的最终目标到底是什么,但我想这就是你一直在寻找的答案。

我不确定,这些东西

(defn funct-op [f list]
  (apply f list))

(funct-op + '(1 2));=>3

funct add
应该获取未赋值的参数列表,对其求值并生成结果。因此
(funct add'-2))
将产生0。通常情况下,
(funct add'(二进制运算操作数1操作数2))
,其中二进制运算可以是+、-,或使用前缀表示法接受两个参数的任何运算符。谢谢。@tscala我想关键是,如果名称中的“add”不仅仅是add,那么为什么名称中会有“add”。另外,请记住,您不必为了避免评估整个表单而引用列表。如果您想评估内容,而不是表单作为函数调用,可以使用
list
<代码>(列表+12)。当然,只使用一个向量要好得多。@AdrianMouat你确实提出了一个很好的观点。我应该编辑这篇文章,以反映我所追求的普遍性。谢谢。@Rayne如果向量arg在
(funct add[+2])
中,这不是我想要的行为。否则,举个例子?谢谢。谢谢你的解决方案。讨论我的最终目标更适合另一个问题(或者这样做是否允许我提出问题)?