【问题标题】:How smart is Clojure with regexp parsing/compiling?Clojure 在正则表达式解析/编译方面有多聪明?
【发布时间】:2021-02-18 03:42:10
【问题描述】:

想象一下,我有一个类似的 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)
...
)

【问题讨论】:

    标签: java regex clojure clojure-java-interop


    【解决方案1】:

    对于函数:

    (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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-03
      • 2013-06-23
      • 2014-02-02
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多