gpt4 book ai didi

loops - Clojure - recur 适用于循环或 let 语句?

转载 作者:行者123 更新时间:2023-12-01 15:07:40 25 4
gpt4 key购买 nike

我在 Clojure 中有一个关于 recur 的问题。如果我在循环内有一个 let 语句,是否可以将 recur 调用应用于 let 语句而不是循环的值?例如,在这种情况下:

(defn someFunction [listA listB]
("do something here...."
[new-listA new-listB]))

(defn anotherFunction [listA listB]
("do something here...."
[new-listA new-listB]))

(defn myFunction [firstList secondList]
(loop [list1 (someMutation firstList)
list2 (someMutation secondList)]
(if (= "true" (someCondition))
(let [[newlist1 newlist2]
(someFunction list1 list2)]
(recur newlist1 newlist2))
(anotherFunction list1 list2) )))

(recur newlist1 newlist2) 是应用于循环还是应用于 let?假设我无法改变“someFunction”返回带有两个参数的向量这一事实,是否可以跳过这个 let 语句并直接使用“someFunction”返回的两个值调用 recur?

最佳答案

recur 总是递归到最近的 loop 或函数,以更接近 recur 形式的为准。它通过编译为本质上是一个循环/跳转语句来实现这一点,该循环/跳转语句更改循环变量的值,然后跳回到循环/fn 点。这样它只使用一个堆栈帧并且可以全速运行。这种设计有一些有意的权衡:

  • 你不能交错嵌套循环
  • recur 只能是表达式中的最后一个东西。
  • 必须有与循环/函数相同数量的参数才能重复出现

最后一个要求您保留 let 表达式或类似解构形式的等价物。循环确实允许像函数一样解构参数:

 (loop [[a b] [1 2]]
(println a b)
(if (< a 10)
(recur [(inc a) (inc b)])))
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
10 11

因此您可以编写循环表达式来直接获取 someFunction 的结果

(loop [[list1 list2] [(someMutation firstList) (someMutation secondList)]]
...
(recur (someFunction ...))

关于loops - Clojure - recur 适用于循环或 let 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41749271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com