使用正则表达式 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")
想象一下,我有一个类似于那个的 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")