java - Clojure 的正则表达式解析/编译有多智能?

标签 java regex clojure clojure-java-interop

想象一下,我有一个与那个类似的 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/

相关文章:

java - Android - 如何接听 Skype/VoIP 电话?

java - 如何以 super 用户身份访问HBase Shell? (预配置虚拟机 CDH 5.7.2、HBase 1.2)

java - 获取目录的全名及其包含的字符串

Javascript 正则表达式 - 匹配域和任何可能的子域

regex - 如何在 sublime 文本的范围内进行 vi 搜索和替换

java - 如何获取特定语言环境的数字格式模式?

php - 使用 Regex、PHP 或 Javascript 搜索链接并识别 RSS 源

macros - database_column_names 的 clojure-variable-names

clojure - "%&"在 Clojure 中是什么意思?

python - Python 成语 "if __name__ == ' __main_ _'"的 clojure 等价物是什么?