gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:02:40 25 4
gpt4 key购买 nike

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

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

  • 就输入而言,函数本身混合了 (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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com