Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure生成函数_Clojure_Closures_Generator - Fatal编程技术网

Clojure生成函数

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”[

我使用这个函数创建一个新函数,它返回一个新位置,用于在PDF中放置内容

发电机必须为每次呼叫返回新线位置。但它也必须能够重置为某个值

(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)])