Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Clojure中的函数中定义函数并引用该函数?_Clojure - Fatal编程技术网

如何在Clojure中的函数中定义函数并引用该函数?

如何在Clojure中的函数中定义函数并引用该函数?,clojure,Clojure,我编写了一个函数来计算两个集合的对称差(现场的一个问题)。该函数通过了单元测试,但由于我有重复的代码,它没有我希望的那么干净 (fn [x y] (set (concat (keep-indexed #(if (nil? (get y %2)) %2) x) (keep-indexed #(if (nil? (get x %2)) %2) y)))) 显然,我更喜欢这样的东西: (fn [x y] (set (concat (diff x y) (diff y x)))) diff

我编写了一个函数来计算两个集合的对称差(现场的一个问题)。该函数通过了单元测试,但由于我有重复的代码,它没有我希望的那么干净

(fn [x y] (set (concat 
  (keep-indexed #(if (nil? (get y %2)) %2) x)
  (keep-indexed #(if (nil? (get x %2)) %2) y))))
显然,我更喜欢这样的东西:

(fn [x y] (set (concat (diff x y) (diff y x))))

diff函数定义和引用为“inline”,但我不知道如何在一个fn块中实现。

使用
let
letfn

(fn [x y]
  (let [diff (... function body here ...)]
   (set
    (concat (diff x y) (diff y x)))))

Clojure成为lisp(通常是一种函数式语言)的一个特点是函数是Clojure中的头等事物,特别是它们是对象。当您使用
(defn name[arg]…)创建函数时,
if生成函数,然后将其存储在变量中,以便以后可以从程序中的任何位置找到它。很像这样:

(def name (fn [arg] ...))
现在,name包含一个可广泛访问的函数。函数不必存储在变量中,特别是当它们只在函数中需要时。在这种情况下,将函数绑定到本地名称(如Matt Fenwick answer)更有意义

(let [name (fn [agr] ...)] ...)
letfn
宏使此操作更加优雅。
重要的是要理解函数是存储在事物中的对象,你可以选择适合你需要的容器。

你可以在4clojure上看到其他人的答案(一旦你完成了问题),这会让你知道如何整理自己的尝试。你为什么说“重要的一点是要理解函数是存储在事物中的对象”?说“对象”可能会让人认为你在谈论面向对象的对象。我认为小写的“对象”在这里可能更好。(我知道Clojure是在JVM上实现的,很多东西都是作为OO类和对象实现的,但我认为新的Clojure人不一定需要考虑实现细节。)