clojure - Clojure 映射中的函数调用顺序是否保证运行时顺序处理?

标签 clojure

我正在研究以下功能:

(defn process-request [request]
  (if (not (db/empty?))
    {:person (db/get-person!) :violations (:violations (process-violations request))}
    {:person {} :violations ["no-person"]}))

我需要 process-violations 函数只在数据库不为空时被调用。这就是它位于 if block 中的原因。

但是,我还需要在 db/get-person! 函数 之前调用它。否则,该值将过时。

所以我想知道:

  • 我该怎么做?
  • 无论如何,映射中值的顺序是否足以保证一个函数总是在另一个函数之前被调用?

最佳答案

不, map 没有排序。对于小型文字 map ,它可能会起作用,但你不应该依赖它,而对于更大的 map ,它确实会失败:

user=> {0 (println 0) 1 (println 1) 2 (println 2) 3 (println 3) 4 (println 4) 5 (println 5) 6 (println 6) 7 (println 7) 8 (println 8) 9 (println 9)}
0
7
1
4
6
3
2
9
5
8
{0 nil, 7 nil, 1 nil, 4 nil, 6 nil, 3 nil, 2 nil, 9 nil, 5 nil, 8 nil}

但是通过使用 let 绑定(bind)总是很容易强制排序,这些绑定(bind)在 let 主体之前按顺序计算。

(let [person (db/get-person!)]
  {:person person :violations ...})

关于clojure - Clojure 映射中的函数调用顺序是否保证运行时顺序处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69020254/

相关文章:

clojure - 如何以及为何使用 defmulti 和 defmethod?有什么优点?

clojure - Python3 关闭 IPC

macros - 从另一个命名空间调用的宏生成宏::无法引用不存在的合格变量

Clojure:将值设置为键

java - 直接来自 Clojure Repl 的 Browning javadoc

clojure - 如何减少下面 Clojure 代码中的重复?

用于 HashMap 的 Clojure DRY 模式?

clojure - 相当于 Common Lisp 中 Clojure 的 “assoc-in” 和 “get-in”

macros - 用 Clojure + Midje 重新定义宏操作

clojure - :volatile-mutable versus :unsynchronized-mutable? 的语义含义是什么