gpt4 book ai didi

string - Clojure 中将字符串转换为整数向量的功能解决方案

转载 作者:行者123 更新时间:2023-12-02 01:14:38 25 4
gpt4 key购买 nike

我已经成功编写了一个函数,可以将空格分隔的整数字符串转换为 Clojure 中的整数向量,但由于我对函数式语言非常陌生,我担心我仍然过于程序化地思考。

该函数使用 split 对字符串进行标记,然后迭代返回的向量,将标记单独转换为整数,然后将它们附加到新向量。我使用 read-string 因为输入是自行提供的,而且我并不真正担心安全性。

    (defn parser [myStr]
;;counter
(def i 0)
;;tokenizes string and returns vector of tokens
(def buffer (clojure.string/split myStr #"\s"))
;;reads vector of strings as integers then appends them to a new vector x
(def x (vector-of :int))
(while ( < i (count buffer))
(def x (conj x (read-string (nth buffer i))))
(def i (inc i)))
(println x))

我的代码可以工作,但我担心通过改变状态并迭代缓冲区向量,我有点作弊并坚持我的程序根源。

有没有更优雅或更实用的方法来解决这个问题?

最佳答案

这里有一些非常值得注意的事情:

  • 永远不要defn内部使用def,除非你有非常好的理由。这里的用例是不合理的。只需使用 let 即可:

    (defn parser [myStr]
    (let [i 0
    buffer (clojure.string/split myStr #"\s")
    x (vector-of :int)]
    ...)

    要查看差异,请运行您的函数,然后检查 i 包含什么内容。 def 创建在函数退出后持续存在的全局变量,这会泄漏函数的状态并污染命名空间。

  • 您正在使用 read-string 进行解析。不要那样做。只需使用 Java 的 Long/parseLong 即可。 read-string 具有 eval 行为,滥用这种行为是不好的。您还可以使用 clojure.edn/read-string ,它可以读取 Clojure 结构和文字,但不执行代码。

  • 当您实际上可以使用loop或许多其他函数方法时,您正在使用while来执行副作用。 @xs0 基本上是正确的。我将你的函数写为:

    (defn parser [myStr]
    ; The v in mapv means it returns a vector
    ; Just map returns a lazy seq
    (mapv #(Long/parseLong %) (clojure.string/split myStr #"\s"))

    不幸的是,Long/parseLong 需要包装在函数中,因为 Java 互操作方法不能像普通 Clojure 函数一样使用。

    仅当您可以保证 split 返回的每个标记都是可解析的时,

    Long/parseLong 才可以安全使用。当然,如果没有这样的保证,您需要进行一些错误处理,或者在尝试解析之前清理输入。

关于string - Clojure 中将字符串转换为整数向量的功能解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47438981/

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