haw*_*eye 5 lisp hash function idiomatic clojure
我正在传递一个函数的名称,以便在另一个方法中使用.
(defn mapper [m function]
(cond
(= '() m) '()
true (cons (function (first m))
(mapper (rest m) function))))
(println (mapper '((blue red)(green red)(white red)) #'first))
Run Code Online (Sandbox Code Playgroud)
在clojure中有没有更惯用的方法呢?
#'first变量叫做"第一"; firstvar的值是"first",即fn.在这种情况下(#'first foo),(first foo)给出相同的答案,但#'first每次调用时都会进行额外的解除引用.所以不要这样做,除非你想要反复引用一遍又一遍.通常没有必要使用#'.map是懒惰的,而你的不是.内置map利用了chunked seqs以获得更好的性能,而你的没有.惯用代码不一定是懒惰的或者使用chunked seqs,但要记住内置函数有一些神奇的功能.所以利用它是好事.(= '() x),对于空seq的惯用测试是(seq x),nil如果x为空则返回.请注意,在Clojure中,这(= '() nil)是假的.().map首先接受函数参数,因为它接受多个集合参数.当一个函数接受多个参数时,这些参数必须在参数列表中排在最后.我认为它的读法也更好:"(map f coll):在这个集合中映射这个函数".cond如果您只有两个选项,则无需使用.你可以if改用.如果你if回来的其中一个分支nil,你可以使用when.这是很好的使用when,并if在适当的时候,因为他们马上显示你的意图给读者,而cond可以做任何事情,并强迫读者阅读更多.RafałFowgird的版本是惯用的,除了我翻转的论点顺序.我会这样称呼它:
user> (mapper first [[:blue :red] [:green :red] [:white :red]])
(:blue :green :white)
Run Code Online (Sandbox Code Playgroud)