【问题标题】:Different results when a function is evaluated in the REPL than in a program在 REPL 中评估函数时的结果与在程序中评估的结果不同
【发布时间】:2013-05-13 21:36:59
【问题描述】:

我感觉我的问题的答案与 Clojure 的惰性评估有关(我对此仍然很模糊......)

所以我有一个函数:

(defn fix-str-old [string]
  (let [words (->> string
                   (clojure.string/split-lines) 
                   (map #(clojure.string/replace % #"\W" "")))]
    (apply str (interleave words (repeat " ")))))

基本上,它只需要一个带有非字母数字字符、字符、返回字符、换行符等的古怪句子代替空格,然后将其转换为常规句子。如果您好奇,这样做的原因是每当我尝试复制某些 PDF 文件时,它都会在单词之间插入换行符和其他神秘字符。

这是一个例子:

(fix-str "A 
  block 
  of    
  SQL   
  statements    
  that  
  must  
  all   
  complete  
   successfully 
  before    
  returning 
  or    
  changing  
  anything  ")

==> "A block of SQL statements that must all complete  successfully before returning or changing anything"

它在 REPL 中运行良好,但是当它在一个小摇摆 gui 中进行评估时,你会得到:

"AblockofSQLstatementsthatmustallcompletesuccessfullybeforereturningorchanginganything "

(注意字符串末尾的空格)

我很确定这是因为我对 Clojure 如何处理惰性 seq 的理解存在一些差距,所以我创建了这个只执行正则表达式操作的函数。

(defn fix-str [string]
  (-> string
      (clojure.string/replace #"[ \t\n\r]+" " ")
      (clojure.string/replace #"[^a-zA-Z0-9 ]" "")
      (clojure.string/trimr)))

这不是懒惰的,并且在 REPL 和 GUI 中都可以正常工作。

注意:我还尝试将 doall 语句放在原始函数中的不同位置,虽然我认为确保它强制评估惰性序列可能是有意义的,但我也无法让它工作。

所以我的问题不是第一种方法是否是修复字符串的好方法,而是为什么我在 REPL 和我的 GUI 中得到不同的结果。

【问题讨论】:

  • 正如 Alex 所说,它在 REPL 中的工作方式相同,或者在正常运行时,您从 GUI 输入的字符串不是您认为的那样。

标签: user-interface clojure lazy-evaluation read-eval-print-loop


【解决方案1】:

在这里,懒惰不应该是您的问题,因为(apply str ...) 强制实现来自map 的输出(并且因为这里没有绑定,这通常是您发现懒惰是罪魁祸首的第一条线索)。

在我看来,来自 GUI 的行尾有些奇怪,split-lines 没有拆分任何内容。该函数在\n\r\n 上拆分-也许您以某种方式从GUI 获得\r 作为行尾?您可以通过将其添加到 fix-str 函数的开头来验证这一点:

(doseq [c string] (println (int c)))

【讨论】:

  • 很好地检查 GUI 字符串...当我将字符串从文档复制到 REPL 时,它看起来像上面,但是 GUI 将 9 32 32 160 放在所有单词之间(这是水平的-tab space space non-breaking-space),没有一个被分割线打破。
  • 关于绑定的好建议是懒惰也是一个问题的线索。
猜你喜欢
  • 2013-01-23
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
相关资源
最近更新 更多