【问题标题】:Generator pattern code can't return value生成器模式代码无法返回值
【发布时间】:2023-03-14 18:58:02
【问题描述】:

我想创建一个生成器来做,1 2 3 4。

(defn getNums []
  (loop [i  4
         r []]
    (when (<= i 0)
      r                ;<--- point A
      (recur (dec i) 
             (conj r i)))))

(getNums)  ;Eval to nil. 

没有回报,为什么?

A点的代码会返回结果向量r吗?

【问题讨论】:

标签: clojure


【解决方案1】:

when,是一个clojure宏,定义为:

(when test & body)

因此,在您的第一个示例中,when 的主体是:

  (do
  r                
  (recur (dec i) 
         (conj r i)))

when 测试本身被评估为 false,因此不会执行 when 宏的主体。 函数的返回值因此它本身的返回值是return,也就是nil。例如:

  (when (< 2 1)) ; nil

顺便说一句,有一个内置函数 range 与您的方法相同:

(range 1 10)

而且,以更通用的方式,您可以使用惰性函数 iterate

(take 10 (iterate inc 1))

【讨论】:

    【解决方案2】:
    (defn getNums []
      (loop [i  4
             r []]
        (if (<= i 0)
          r
          (recur (dec i) 
                 (cons i r)))))
    
    (getNums)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 2017-08-30
      • 2021-01-16
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多