函数在对正则表达式组(Clojure)执行操作时行为不端



下面的代码有一个错误,让我大吃一惊。我的目标是用相对链接的markdown格式替换用双方括号括起来的东西。"slug"函数是删除空格和更改文件扩展名的助手。当我直接调用它时,它似乎工作得很好——它将"its a link"变成了"its a-link.html"。但当我在"$1"上调用它时它修复了文件扩展名,但不会将空格变成连字符。这是我第一次使用"$1",所以这是我对问题所在的判断

(ns grothendieck.nanoformats
  (:require [clojure.string :as string])
  (:require [swiss.arrows :refer :all]))
(defn slug [f]
  "Replaces a filename's spaces with friendly hyphens and prepares its file extension."
  (-<> f
      (string/lower-case)
      (string/replace <> " " "-")
      (string/replace <> #".(wiki|md)" "")
      (str <> ".html")))
(defn internal-links [text]
  (string/replace text #"[[(.+)]]" (str "[$1](" (slug "$1") ")")))

函数slug获取"$1"作为参数,因为str表单在string/replace看到它之前已经完全求值。您想要的不是模式字符串,而是函数。

(defn internal-links
  [text]
  (string/replace text #"[[(.+)]]"
                  (fn [[full-match first-group]]
                    (str "[" first-group "](" (slug first-group) ")"))))

最新更新