下面的代码有一个错误,让我大吃一惊。我的目标是用相对链接的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) ")"))))