想象一下,我有一个与那个类似的 Clojure 函数
(defn ABC
[tag v]
(let [value (->> (str/split v #",")
(map str/trim)
(map u/capitalize)
(str/join ", "))]
...)))
该函数可以被调用多次。正则表达式 #", "只会被解析一次吗(我希望如此)?有源代码/证明吗?
如果我有第二个具有相同正则表达式的函数怎么办?从技术上讲,它是否与第一个函数中的正则表达式实例相同?或者它将是 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");
}
}
正如您所看到的,它被编译成静态初始化 block 中的Pattern
。所以写成字面量就可以了。
第二个函数将有自己的Pattern
对象。如果您想共享实例,您应该自己这样做
(def pat #"bar")
关于java - Clojure 的正则表达式解析/编译有多智能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64697122/