Clojure生成函数
我使用这个函数创建一个新函数,它返回一个新位置,用于在PDF中放置内容 发电机必须为每次呼叫返回新线位置。但它也必须能够重置为某个值Clojure生成函数,clojure,closures,generator,Clojure,Closures,Generator,我使用这个函数创建一个新函数,它返回一个新位置,用于在PDF中放置内容 发电机必须为每次呼叫返回新线位置。但它也必须能够重置为某个值 (defn pos生成器[初始值增量] (让[计数器(参考初始值)] (fn([])(dosync(let[cur val@counter] (do(改变计数器+增量) cur val))) ([new val](dosync(参考设置计数器new val)) )))) ; 用法示例: (让[YPO(pos生成器470-15)] (添加到pdf“bla bla”[
(defn pos生成器[初始值增量]
(让[计数器(参考初始值)]
(fn([])(dosync(let[cur val@counter]
(do(改变计数器+增量)
cur val)))
([new val](dosync(参考设置计数器new val))
))))
; 用法示例:
(让[YPO(pos生成器470-15)]
(添加到pdf“bla bla”[290 y])
(添加到pdf“bla bla”[290 y]))
但这似乎有点尴尬,有没有一种更具意识形态的Clojure方式?使用edbond建议的
atom
,在IMO中会产生更为惯用的代码,因为您不需要在两个或多个ref
之间进行同步,而只需要一个存储不断变化的值的地方
(defn pos-generator [initial-val delta]
(let [counter (atom initial-val)]
(fn
([]
(let [cur-val @counter]
(swap! counter + delta)
cur-val))
([new-val]
(reset! counter new-val)))))
(let [ypos (pos-generator 470 -15)]
[[290 (ypos)]
[290 (ypos)]
[290 (do (ypos 20) (ypos))]
[290 (ypos)]])
;= [[290 470] [290 455] [290 20] [290 5]]
作为旁注,在
let
表单中的代码中不需要使用do
,它已被以与do
中相同的方式处理(def y-position(atom initial val))
和交换代码>重置代码>功能在使用示例中,您没有使用ypos
生成器功能。不应该(添加到pdf“bla-bla”[290 y])
实际上是(添加到pdf“bla-bla”[290(ypos)])
?