有一大块代码(大部分不是我的)通过用户输入执行以下操作(或多或少,带有一些参数/选项的空格分隔的命令列表):
就输入而言,函数本身混合了 (case)、(cond)、(condp)、(=) 和 (compare) 以及一些讨厌的 (keyword) 比较。
每个人都很好,直到最近这一切都严格区分大小写。现在出现了一些(以前未知的)作为用户的古老集成位,并且出现了一些我无法控制的外壳问题。
问题:是否有一种可行的方法(在有更多时间重做之前的快捷方式)基于某个变量使字符串比较对某种范围不区分大小写?
我考虑了3个选项:
经过一些研究,答案可能是否定的(应该开始计划重大更改),但我认为询问不会有任何伤害,也许有人以前想过。
编辑:示例有问题的输入:
"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))
assert
在 standardize
是必要的,因为 lower-case
把事情变成字符串:(clojure.string/lower-case 22)
=> "22"
关于clojure - 为大量 Clojure 代码切换区分大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43738683/