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 - Fatal编程技术网

在Clojure中实现中断

在Clojure中实现中断,clojure,Clojure,如果条件匹配并返回最后一个值,是否有办法在Clojure中中断循环?大多数算法在找到结果时返回结果,避免完成整个执行过程,从而受益匪浅 假设我有一个100个数字的向量,范围从0到100,我想找到数字10。一旦找到10,我希望停止执行 比我的示例更简单的情况如下: (defn MySearch [y] (when (< y 10) ;;Corrected. Thanks to dsm who pointed it out. Previously was (< y 5)

如果条件匹配并返回最后一个值,是否有办法在Clojure中中断循环?大多数算法在找到结果时返回结果,避免完成整个执行过程,从而受益匪浅

假设我有一个100个数字的向量,范围从0到100,我想找到数字10。一旦找到10,我希望停止执行

比我的示例更简单的情况如下:

(defn MySearch
    [y]
    (when (< y 10)

;;Corrected. Thanks to dsm who pointed it out. Previously was (< y 5).

        (if (= (nth [1 2 3 4 5 6 7 8 9 10] y) 10)
            (println 
                "I found it! Now I want to stop executing!"
            )
        )
        (recur
            (inc y)
        )
    )
)

(MySearch 0)
user=> (loop [[x & t] [0 1 2 3 4 5 6 7 8 9]]
  #_=>   (println "x=" x)
  #_=>   (if (= x 5)
  #_=>     x
  #_=>     (recur t)))
x= 0
x= 1
x= 2
x= 3
x= 4
x= 5
5
user=> 
(defn MySearch
[y]
(当(
当我找到5时,我如何停止

我已经搜索够了,我找不到任何方法来实现这一点。我在这里也找到了一个答案,说明我所问的问题在Clojure中并不存在,但我觉得有点牵强。即使是这样,我自己能实现这样的东西吗


(我是Clojure的新手。)

您实际上不需要
break
语句,因为循环在Clojure中的工作方式与在java中的工作方式非常不同。例如:

(defn MySearch
    [y]
    (when (< y 10)

;;Corrected. Thanks to dsm who pointed it out. Previously was (< y 5).

        (if (= (nth [1 2 3 4 5 6 7 8 9 10] y) 10)
            (println 
                "I found it! Now I want to stop executing!"
            )
        )
        (recur
            (inc y)
        )
    )
)

(MySearch 0)
user=> (loop [[x & t] [0 1 2 3 4 5 6 7 8 9]]
  #_=>   (println "x=" x)
  #_=>   (if (= x 5)
  #_=>     x
  #_=>     (recur t)))
x= 0
x= 1
x= 2
x= 3
x= 4
x= 5
5
user=> 
如果(x==5)中断,则大致相当于
在java中

您必须记住,在clojure中,它本身并不循环,而是设置一个目标

我建议你仔细研究一下这个问题,以便熟悉其中更奇怪的方面

编辑:在我盗用我的响应时,您似乎添加了一些代码,但不用担心,命名函数也是一个重复目标,所以我上面所说的仍然适用:)。以下是以更lisp-y格式重新格式化的代码:

user=> ; FYI: This function will never print "success"
user=> (defn my-search
  #_=>   [y]
  #_=>   (if (< y 5) ; <-- Because of this.
  #_=>     (if (= (nth [1 2 3 4 5 6 7 8 9 10] y) 10)
  #_=>       (println "Success!")
  #_=>       (recur (+ y 1)))
  #_=>     (println "y is >= 5")))
#'user/my-search
user=> (my-search 3)
y is >= 5
nil
user=> 
user=>;仅供参考:此功能永远不会打印“成功”
用户=>(定义我的搜索)
#_=>[y]
#_=>(如果((打印“成功!”)
#_=>(重复出现(+y 1)))
#_=>(println“y大于等于5”))
#'用户/我的搜索
用户=>(我的搜索3)
y大于等于5
无
用户=>

你几乎把它做好了。重新格式化你的代码,我们得到

(defn MySearch [y]
  (when (< y 10)
    (if (= (nth [1 2 3 4 5 6 7 8 9 10] y) 10)
      "I found it! Now I want to stop executing!")
    (recur (inc y))))
为什么?

问题在于
(重现…
if
之外。这有什么用

  • 如果满足
    时的
    条件,则
    (如果…
    和 依次执行
    (重现…
    ,并返回后者的结果 返回
  • 最后,
    y
    10
    ,因此当
    条件失败时
    ,当
    
    返回
    nil
如果
,让我们将重现移动到
中:

(defn MySearch [y]
  (when (< y 10)
    (if (= (nth [1 2 3 4 5 6 7 8 9 10] y) 10)
      "I found it! Now I want to stop executing!"
      (recur (inc y)))))
因为我们返回了消息,所以我们知道函数确实停止了执行。否则它将继续并返回
nil

println
处于适当位置时,函数将输出消息并立即返回
nil
,就像它继续执行时一样。至于它是否停止执行,你一点也不知道


顺便说一下,作为本书的作者,让我再试一次:

  • Clojure中没有break语句
  • 反过来说:

    • 默认情况下,您将中断循环
    • 您必须使用
      recur
      继续
  • recur
    是对正在执行的函数(或
    loop
    )的特殊递归调用:

    • 其中它是返回值
    • 据说它处于尾部位置
大多数Lisp系统自动检测这样的调用,即所谓的尾部调用。 因此,它们没有或不需要像
recur
这样的构造



话虽如此,Clojure 1.5引入了
reduced
:一种类似于
break
的reduce结构。你可以读到它

你能在这里放一些示例代码吗?当然,我现在就编辑它!我写这个函数的时候考虑到了其他一些东西,然后我在不改变条件的情况下改变了向量。谢谢你的指点!你的答案很有帮助,但另一个答案完全回答了我的问题,并给出了明确的解释。我不得不接受这个。不过,非常感谢。:)非常感谢你!回答得很好!这不是我所指的答案。另外,你在超链接中放置的超链接非常棒,也非常有用+1:P