clojure延迟函数执行

Sur*_*rya 12 clojure lazy-evaluation

好的这就是我想要做的

(defn addresses [person-id]
 ;addresses-retrival )

(defn person [id]
  (merge  {:addresses (addresses id)} {:name "john"}))
Run Code Online (Sandbox Code Playgroud)

在上面的人员功能中,我希望仅在需要时检索地址,就像我一样

(:addresses (person 10)) 
Run Code Online (Sandbox Code Playgroud)

而不是什么时候

(person 10)
Run Code Online (Sandbox Code Playgroud)

我不确定我是否正确这样做,对clojure不熟悉.

Nic*_*ury 10

你可以使用延迟.

(defn person [id]
  (delay  {:addresses (addresses id) :name "john"})) 
Run Code Online (Sandbox Code Playgroud)

(人2)将返回延迟,而不评估任何东西.要访问内容并评估延迟对象,请使用force或deref(或@).

(:addresses @(person 5))
Run Code Online (Sandbox Code Playgroud)

或者,您可以仅将延迟放在地址上.

(defn person [id]
  {:addresses (delay (addresses id)) :name "john"})
Run Code Online (Sandbox Code Playgroud)

哪个可以更好,取决于你的问题.

它允许定义:

(defn get-address [person]
  @(:address person))
Run Code Online (Sandbox Code Playgroud)

哪个会得到延迟的地址并强迫它.(强制意味着第一次计算并在任何其他时间检索强制结果).