代码之家  ›  专栏  ›  技术社区  ›  rezwits

Clojurescript多词替换(及更多)

  •  0
  • rezwits  · 技术社区  · 8 年前

    我在数据库中有卡片,每张卡片都有一些段落的文字。我想用HTML符号替换“特定短语”。因此,当它们显示时,短语是符号而不是文本。

    我的代码运行得非常完美,除了调用final函数的方式。

    (我会尽量避免信息过载,但是) 我这样调用最终函数:

    ...{:__html                          (add-symbols
                                           (add-symbols
                                             (add-symbols
                                               (add-symbols
                                                 (add-symbols
                                                   (add-symbols
                                                     (add-symbols
                                                       (add-symbols
                                                         (add-symbols
                                                           (add-symbols
                                                             (add-symbols
                                                               (add-symbols
                                                                 (:text card)))))))))))))}
    

    我这样调用此函数的原因是,add symbols函数接受“card text”并找到第一个匹配项,然后返回更新后的“card text”或(:text card),然后再次调用它。

    由于第一次出现的符号现在已经消失并替换为html编码的符号,因此我可以再次扫描并替换,等等,这个次数将涵盖文本的数量和符号的频率。

    但最近,我一直在与Clojure for the Brave温习Clojure,我偶然发现并注意到了fn(减少…)

    我知道这并不容易。但我想的是:

    (reduce add-symbols (:text card))
    

    正如我所说,我知道这不会那么容易,;)但是,我应该循环一下吗?还是怎样

    我以前的代码可以工作,但它太可怜了,完全遍历所有文本并替换所有短语,无论段落的长度如何,使用一些锐利的reduce,将是理想的!

    谢谢你的帮助!

    3 回复  |  直到 8 年前
        1
  •  2
  •   Mike Fikes    8 年前

    你 可以 使用 reduce 如果您将其与 iterate 生成一系列新的文本值,以及一个在未看到更改时停止缩减的函数。这 calculates a fixed point 属于 add-symbols ,从值开始 (:text card) :

    (reduce #(if (= %1 %2) 
              (reduced %1) 
              %2) 
      (iterate add-symbols (:text card)))
    

    作为奖励,ClojureScript 1.10.238 迭代 生成 directly reducible 后果没有产生中间序列(很像低级别 loop / recur 方法)。

        2
  •  1
  •   Alan Thompson    8 年前

    大致来说,您可能需要以下内容:

    { :__html
      (loop [curr-card (:text card)]
        (if (is-finished curr-card)
          curr-card
          (recur (add-symbols curr-card)))) }
    

    但是 is-finished 功能和 add-symbols 将取决于您的详细信息(请更新问题)。

        3
  •  0
  •   rezwits    8 年前

    好吧,我和 环 ,然后我读了你的帖子,认为我可能走上了正确的道路,但是呃(这种语言很难,但当你成功的时候,你会有一种很好的ole奖励的感觉,就像“过去的日子”)

    我试着 允许 和 环 甚至,因为我意识到我所做的只是“伪递归”手动调用我的函数,13次,然后说,这就足够了。在学习了这么多之后,最后,我决定(在 Redefining a let'd variable in Clojure loop )使用 什么时候 由于“已完成”条款,这将是最好的。

    此代码完成作业:

    ...{:__html
         (let [new-text (atom (add-symbols (:text card)))]
           (when (= @new-text (add-symbols @new-text))
             @new-text
             (swap! new-text #(add-symbols @new-text))))}...
    

    使用循环

    ...{:__html
         (loop [new-text (:text card)]
           (if (= new-text (add-symbols new-text))
             new-text
             (recur (add-symbols new-text))))}...
    

    他们(都)做事干净利落。我之所以不想说“更多信息”,是因为我读了《Clojure for The Brave》中的一句话:

    “相比之下,Clojure的结构非常简单且一致。无论您使用的是哪种运算符或您操作的是哪种类型的数据,结构都是相同的。”

    这对我来说意味着,“看,无论你在做什么,翻转煎饼或更换轮胎,如果你有操作员和数据,在某些“核心”操作将是相同的,我喜欢Clojure!我知道我并不坚持使用纯不变的对象,但我想 原子 最终必须习惯。。。

    哦,基本上,“完成了”正在检查,运行FN,文本是否更改?

    谢谢

    其他源代码:

    (defn make-span [text symbol path]
      (.replace text (apply str symbol) (str "<img src='" path "'style=\"width:16px;height:16px;\"></img>")))
    
    (defn add-symbols [card-text]
      (-> (if (nil? card-text) "" card-text)
      (make-span "[b]" "img/dc/me_bl.png")
      (make-span "[c]" "img/dc/me_cs.png")
      (make-span "[d]" "img/dc/me_dd.png")
      (make-span "[f]" "img/dc/me_fd.png")
      (make-span "[j]" "img/dc/me_ju.png")
      (make-span "[s]" "img/dc/me_sl.png")
      (make-span "[w]" "img/dc/me_wi.png")))
    
    (defn- card-text
      "Generate text html representation a card"
      [card cursor]
      [:div
       [:h4 (:title card)]
       [:div.text
        [:p [:span.type (str (:type card))] (if (= (.toLowerCase (:type card)) (:Secondary card))
                                              ""
                                              (str ": " (:Secondary card)))]
        [:pre {:dangerouslySetInnerHTML #js {:__html
                                             (let [new-text (atom (add-symbols (:text card)))]
                                               (when (= @new-text (add-symbols @new-text))
                                                 @new-text
                                                 (swap! new-text #(add-symbols @new-text))))}}]]])
    

    有更多的代码,但这并不是这个问题的真正目的或应用。我真的很兴奋能找到问题的确切要点或“关键”,再次感谢!!