使用正则表达式 parsing/compiling 的 Clojure 有多聪明?

How smart is Clojure with regexp parsing/compiling?

想象一下,我有一个类似于那个的 Clojure 函数

(defn ABC
  [tag v]
  (let [value (->> (str/split v #",")
                   (map str/trim)
                   (map u/capitalize)
                   (str/join ", "))]
...)))

该函数可以被调用多次。正则表达式 #", " 是否只会被解析一次(我希望如此)?有什么来源 code/proofs 吗?

如果我有第二个具有相同正则表达式的函数怎么办。它在技术上与第一个函数的正则表达式实例相同吗?或者它将是 2 个独立的正则表达式?

(defn XYZ [v]
  (let [adr (str/split v #",")]
        (if (> (count adr) 5)
...
)

对于函数:

(defn --xx-- [] (s/split "foo" #"bar"))

clj-decompiler 为它生成这个 java:

import clojure.lang.*;
import java.util.regex.*;

public final class scheduler$__xx__ extends AFunction
{
    public static final Var const__0;
    public static final Object const__1;
    
    public static Object invokeStatic() {
        return ((IFn)scheduler$__xx__.const__0.getRawRoot()).invoke("foo", scheduler$__xx__.const__1);
    }
    
    @Override
    public Object invoke() {
        return invokeStatic();
    }
    
    static {
        const__0 = RT.var("clojure.string", "split");
        const__1 = Pattern.compile("bar");
    }
}

如您所见,它在静态初始化程序块中被编译为 Pattern。所以按字面意思写就OK了。

第二个函数将有自己的 Pattern 对象。如果您想共享实例,您应该自己这样做

(def pat #"bar")