gpt4 book ai didi

function - 在 Clojure 中传递方法名称以进行评估的惯用方法?

转载 作者:太空宇宙 更新时间:2023-11-03 18:37:18 24 4
gpt4 key购买 nike

我正在传递一个函数的名称以供在另一个方法中使用。

(defn mapper [m function]
(cond
(= '() m) '()
true (cons (function (first m))
(mapper (rest m) function))))

(println (mapper '((blue red)(green red)(white red)) #'first))

在 Clojure 中是否有更惯用的方法来做到这一点?

最佳答案

  • 比起列表更喜欢向量。大多数时候你不必引用向量,而且它在很多事情上都有更好的性能,比如随机访问。列表在 Clojure 中的使用比在其他 Lisp 中要少得多。
  • 优先使用关键字而不是引号。关键字突出显示为“常量字符串”或枚举值。 Clojure 中的关键字可以属于一个命名空间,因此它们具有符号的所有优点。再一次,不需要引用关键字,这很好。在 Clojure 中很少使用带引号的符号,除非您正在编写宏。
  • #'first 是名为“first”的变量; first 是名为“first”的 var 的值,即 fn。在这种情况下,(#'first foo)(first foo) 给出相同的答案,但是 #'first 每次都执行额外的取消引用你叫它。所以不要这样做,除非你希望取消引用一遍又一遍地发生。通常不需要使用 #'
  • 内置的 map 是惰性的,而你的不是。内置的 map 利用分块序列来获得更好的性能,而你的则不然。惯用的代码不必是懒惰的或使用分块的 seqs,但请记住,内置函数具有一些这种魔力。所以最好利用。
  • 而不是 (= '() x),空序列的惯用测试是 (seq x),它返回 nil如果 x 为空。请注意,在 Clojure 中,(= '() nil) 为 false。
  • 如果您确实需要使用空列表(您应该很少需要这样做),则不必引用它。只需使用 ()
  • 内置 map 首先接受函数参数,因为它接受多个集合参数。当一个函数有多个参数时,这些参数必须放在参数列表的最后。我认为它也以另一种方式读起来更好:“(map f coll):将这个函数映射到这个集合中”。
  • 如果您只有两个选项,则无需使用 cond。您可以改用 if。如果您的 if 中的一个分支返回 nil,您可以使用 when。最好在适当的时候使用 whenif,因为它们会立即向读者表明你的意图,而 cond 可以做任何事情并强制读者阅读更多。

Rafał Dowgird 的版本是惯用的,除了我会翻转参数的顺序。我会这样调用它:

user> (mapper first [[:blue :red] [:green :red] [:white :red]])
(:blue :green :white)

关于function - 在 Clojure 中传递方法名称以进行评估的惯用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3457711/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com