- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Clojure 风格(以及一般良好的软件工程)强调许多小函数,其中的一个子集是公开可见的,以提供外部接口(interface)。
在 Clojure 中似乎有几种方法可以做到这一点:
(letfn [(private-a ...)
(private-b ...)]
(defn public-a ...)
(defn public-b ...))
(defn- private-a ...)
(defn- private-b ...)
(defn public-a ...)
(defn public-b ...)
letfn 形式看起来更冗长,而且可能不太灵活,但它缩小了函数的范围。
我的猜测是,letfn 仅适用于其他形式,当仅在很小的区域中使用很少的辅助函数时。这是共识吗? letfn 是否应该在顶层使用(正如我之前所推荐的那样)?什么时候应该使用它?
最佳答案
letfn
用于相互递归的情况:
(letfn [(is-even? [n]
(if (zero? n)
true
(is-odd? (dec n))))
(is-odd? [n]
(if (zero? n)
false
(is-even? (dec n))))]
(is-even? 42))
;; => true
不要在顶层使用它。
此外,除非有非常具体的原因,否则不要在顶层以外的任何地方使用 defn
宏。它将扩展为 def
特殊形式,它将创建和实习全局变量。
关于Clojure 风格 : defn- vs. letfn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23255798/
defn = 公共(public) defn- = 私有(private) 也许我的 Clojure 编码风格不好——但我发现我在 Clojure 中编写的大多数函数都是我不想公开的小辅助函数。 是否
谁能给我解释一下?我想我理解 (defn -main) 声明了一个 Java 可以识别的 main 方法,如果你将它与带有 (:gen-class) 的命名空间一起使用,你可以欺骗 Java 认为 c
我看到 Clojure 函数定义为 (defn toInt([i] (Integer. i))) 为什么参数[i]包含在括号中?这和下面的一样吗?有什么区别吗? (defn toInt [i] (I
我可以在没有副作用的情况下实时重新定义功能吗? defn 线程安全吗? 最佳答案 “线程对开发来说足够安全,而不是在生产中使用。” 使用 defn 重新定义函数可能会破坏调用它的函数,如果它们在调用更
我试图只获取一个生肖名称以将其传递给不同的函数,但我不知道为什么在显示生肖后我会得到空括号。我是 Clojure 的新手。 (defn miko []
如果我明确定义这样的函数 (defn f [x] (get x "a")) , 然后两者 (-> {"a" 1} f)和 (f {"a" 1})按预期工作。 但是,如果我使用匿名函数,则只有 (#(g
Clojure 风格(以及一般良好的软件工程)强调许多小函数,其中的一个子集是公开可见的,以提供外部接口(interface)。 在 Clojure 中似乎有几种方法可以做到这一点: (letfn [
我是 clojure 的 super 新手,我正在尝试为 clojure 函数中的 args 设置故障值。这是我目前所拥有的: (defn get-user-projects-by-user-id (
我定义了一个函数,它接受两个参数 - 映射和一个键。 key引用自map参数分解 (defn myfunc [{v k} k] v) 当我打电话时: (myfunc {:a 10} :a)
我对defn的作用有点困惑。如果 fn 只生成匿名函数,我可以理解需要一个结合 def 和 fn 功能的构造,但 fn 也可以创建命名函数。至少在 repl 中,我看不出这种用法与 defn 有什么不
我用 clojure 编写了一个程序,但有些函数没有参数。将此类函数编码为“def”而不是不带参数的“defn”有什么优点? 最佳答案 (def t0 (System/currentTimeMilli
我是 clojure 的 super 新手,我正在尝试为 clojure 函数中的 args 设置故障值。这是我目前所拥有的: (defn get-user-projects-by-user-id (
我有一个用 Clojure 编写的小游戏。我对这门语言很陌生,我偶然发现的第一个错误是 对 clojure.core/defn 的调用不符合规范。 我不知道是什么导致了这个错误,但是抛出了一个异常:
我熟悉来自例如的包Java 和 Lisp,但我在其他人的代码中看到的是一些明显的习语,例如调用入口点 '-main' 并在 (in-ns `foo) 中对命名空间名称使用反引号,诸如此类。我在文档或教
观察以下 repl session : user=> (set! *warn-on-reflection* true) true user=> (defn blah [s] (for [c s] (i
一些 core.logic 构造( matcha 、 matche 、 matchu 、 defne 、 fne )使用模式匹配表达式作为主体,可以使用,例如: (run* [q] (fresh
我编写了一个宏来将函数定义包装在一些有用的日志记录中: (defmacro defn-logged "Wraps functions in logging of input and output"
我正在练习编写宏,但我似乎无法让 defn 工作。 我的语法是:(my-define nameparameter body) 忽略 & 参数和递归例程,如何将名称绑定(bind)到 (fn[param
在Scheme中,我们只是对所有的定义进行了define,为什么Clojure和Lisp对不同的声明使用不同的关键字? 最佳答案 defn、defmacro、defstruct等只是定义其对应结构的宏
以下是在 Clojure 中编写函数的两种方法: (defn foo [a b] (+ a b)) (fn foo [a b] (+ a b)) 我可以这样调用它们: 在“defn”的情况下 (foo
我是一名优秀的程序员,十分优秀!