在Clojure中访问绑定到变量的函数

3

如果我理解正确,当我编写以下代码时:

(defn foo [x] (+ (* (- x 3) 2) (- x 3)))

foo会被绑定到:

(fn [x] (+ (* (- x 3) 2) (- x 3)))

我该如何从foo中访问该函数? 我的意图是更改函数中的某些内容并返回一个新函数。

1个回答

5

如果您想使用存储在变量 foo 中的函数值,只需写入 foo,例如:

(def foo2 (comp - foo))
(foo 4) ;;=> 3
(foo2 4) ;;=> -3

对于变量,没有特殊的dereference表示法:只需使用它们的名称即可将它们解析为绑定的值。 函数不是您更改的内容,但您可以像上面那样从其他函数构建函数。


嗯,也许我需要重新考虑我的方法。我想做的是像这样的事情,(def bar '(+ (* (- x 3) 2) (- x 3))) 这使我能够执行 (list (first bar) (second bar) 1)。但使用函数实现。 - Fernet
那么你不想要函数,而是一个未求值的表达式。如果你想做这样的事情,请阅读关于宏的内容。 - Michiel Borkent
Fernet: 我认为你正在寻找http://clojure.github.com/clojure/clojure.repl-api.html#clojure.repl/source-fn,从那里你可以(read-string (source-fn 'my-fn-name))并操作表达式。但仅适用于在文件中定义的函数。我不知道为什么Clojure不在其元数据中保留函数的表达式 - 这对以函数式方式转换函数非常有用。 - Hendekagon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接