clojure - 为大量 Clojure 代码切换区分大小写

标签 clojure

有一大块代码(大部分不是我的)通过用户输入执行以下操作(或多或少,带有一些参数/选项的空格分隔的命令列表):

  • 删除所有不支持的字符
  • 在空间上分割成一个向量
  • 递归地将向量中的第一项应用于向量的其余部分(函数使用它需要的任何参数,并返回不包含自身及其参数的向量到循环)。

  • 就输入而言,函数本身混合了 (case)、(cond)、(condp)、(=) 和 (compare) 以及一些讨厌的 (keyword) 比较。

    每个人都很好,直到最近这一切都严格区分大小写。现在出现了一些(以前未知的)作为用户的古老集成位,并且出现了一些我无法控制的外壳问题。

    问题:是否有一种可行的方法(在有更多时间重做之前的快捷方式)基于某个变量使字符串比较对某种范围不区分大小写?

    我考虑了3个选项:
  • 修复代码(无论如何都会在某个时候完成,但目前不可行)。
  • 提取一些低级比较函数(希望只有一个)并将其重新绑定(bind)到本地范围(听起来不错,但捕捉案例可能很困难且容易出错)。
  • 标准化输入(如果没有一些技巧可能无法实现,因为某些数据、外部比较需要区分大小写)。

  • 经过一些研究,答案可能是否定的(应该开始计划重大更改),但我认为询问不会有任何伤害,也许有人以前想过。

    编辑:示例有问题的输入:
    "Command1 ARG1 aRG2 Command3 command9 Arg4 Arg9 aRg5 COMMAND4 arg8"
    

    分解它:
    我需要能够根据需要不区分大小写地匹配大小写错误的“命令”。参数在另一个级别上不区分大小写 - 因此它们与这段代码无关,但应保留这段代码中的大小写以进一步发送。
    注意!在处理开始时不可能告诉输入中的命令和参数是什么。

    最佳答案

    对于它的值(value),这里是一个不区分大小写的简单包装器 case形式:

    (ns lexer.core)
    
    (defn- standardize [thing]
      (assert (string? thing) (str thing " should be a string"))
      (clojure.string/lower-case thing))
    
    (defmacro case-insensitive-case [expr & pairs+default?]
      (let [pairs (partition 2 pairs+default?)
            convert (fn [[const form]]
                      (list (standardize const) form))
            most-of-it `(case (standardize ~expr) ~@(mapcat convert pairs))]
        (if (-> pairs+default? count even?)
          most-of-it
          (concat most-of-it [(last pairs+default?)]))))
    

    例如,
    (macroexpand-1 '(case-insensitive-case (test expression) 
                                           "Blam!" (1 + 1) 
                                           (whatever works)))
    => (clojure.core/case (lexer.core/standardize (test expression)) "blam!" (1 + 1) (whatever works))
    
    assertstandardize是必要的,因为 lower-case把事情变成字符串:
    (clojure.string/lower-case 22)
    => "22"
    

    关于clojure - 为大量 Clojure 代码切换区分大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43738683/

    相关文章:

    Clojure 编码标准 - 用于调用具有多个参数的函数

    clojure - Clojure 中的 Do-while 循环?

    clojure - 两个符号可以绑定(bind)到同一个变量吗?

    macros - 为什么在这个 Clojure 宏上执行 Macroexpand-1 时出现 NullPointerException?

    如果满足条件,PostgreSQL 删除行,否则更新一些值

    Clojure、闭包、WebSocket、在线聊天演示

    clojure - 通过未定义的命名空间访问 clojure 宏

    java - 在 clojure 中构建布隆过滤器时要使用哪些散列技术?

    java - 克洛贾尔/Java : Most effective method for minimizing bandwidth consumption when performing complex operations on a stream of Amazon S3 data

    Clojure 编译器错误