gpt4 book ai didi

for-loop - Clojure:如何返回在函数的 for 循环内计算的值

转载 作者:行者123 更新时间:2023-12-04 08:25:43 26 4
gpt4 key购买 nike

我是 clojure 新手:假设我有一个函数,其中必须在 for 循环内计算某些内容。如何让函数返回一些东西?

以下不起作用:

(defn foo [] (for [i [1 2 3]] (def something 4)) something)
(foo)
me.core=> #object[clojure.lang.Var$Unbound 0x4808dacc "Unbound: #'me.core/something"]

这道题的背景是我想写一个bracket函数,接收一个string和一个brackettype作为参数,返回被brackettype包围的字符串,比如(bracket "hello""]")(方括号 "hello""[") 应返回字符串 "[hello]"

当然,如果有人能提供更clojure 的方式来编写这样的函数,我也将不胜感激。

这是我到目前为止的想法

(def brackets ["()" "[]" "{}" "<>"])

(defn bracket [string brackettype]
(for [b brackets]
[(let [f (str (first b)) l (str (last b))]
(if (or (= brackettype f) (= brackettype l))
(def fstringl (str f string l))))])
bstringb)

(bracket "hello" "[")

=> #object[clojure.lang.Var$Unbound 0x6401b490 "Unbound: #'me.core/fstringl"]

最佳答案

这是一种尝试与找到方括号的“f”和“l”然后使用它们包围给定字符串的方法保持一致的方法。 (正如评论中所提到的,您很少像在过程语言中那样想要显式循环。如果有帮助,您可以考虑高阶函数,例如 filtermapreduce 作为为您执行循环的函数。)

(def brackets ["()" "[]" "{}" "<>"])

(defn bracket [string bracket]
(let [[[f l]] (filter #(.contains % bracket) brackets)]
(str f string l)))

由于字符串本身就是序列,因此顺序解构在这里派上用场,因为 filter 步骤将返回(取决于哪个括号)类似 ("[]") 的内容。通过将其分配给 [[f l]]fl 得到我们想要的值。

没有解构的更详细的版本可能是

(defn bracket [string bracket]
(let [bracket-entry (first (filter #(.contains % bracket) brackets))
f (first bracket-entry)
l (last bracket-entry)]
(str f string l)))

您没有说如果在 brackets 中找不到括号会发生什么。如果你调用 (bracket "hello""|"),在上面的版本中,fl 将是 nil 并返回原始字符串。

这是一个针对该情况进行测试并允许您采取相应行动的版本:

(defn bracket [string bracket]
(if-let [[[f l]] (seq (filter #(.contains % bracket) brackets))]
(str f string l)
"unknown bracket type"))

seq 在这里非常有用,因为它在空序列的情况下返回 nil,否则返回原始序列。因此,如果没有括号通过过滤器,您将转到 if-let 的“else”部分。

关于for-loop - Clojure:如何返回在函数的 for 循环内计算的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59481953/

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