オペレーターの動作==
は固定されています。常に等価性テストを行います。実際、数値の等価性を優先する等価性テストを実行し、他に方法がない場合にのみ文字列の等価性にフォールバックします。
したがって、check
あなたの行動を変えるには、本当にトリッキーになる必要があります。
実行トレースを使用して内部の何かを傍受check
し、ローカル変数に読み取りトレースを配置して、a
それを読み取ったときに、その値が複雑なルールに従って何かと一致するかどうかを実際に取得できるようにすることを検討します。(b
おそらく1
ブール値の true を保持できます。) これを行うためのコードは非常に複雑であり、私は実際にそれを避けるようにしています!
proc
可能であれば、本体にプレフィックスを付けてcheck
そこにトレースを適用できるように再定義する方がはるかに簡単です。または、テスト自体をマッサージすることもできます。
# Rename the command to something that nothing else knows about (tricky!)
rename proc my_real_proc
my_real_proc proc {name arguments body} {
# Replace a simple equality with a basic no-case pattern match
if {$name eq "check"} {
set body [string map {{$a == $b} {[string match -nocase $b $a]}} $body]
}
# Delegate to the original definition of [proc] for everything else
uplevel my_real_proc $name $arguments $body
}
の定義の前にそのコードを実行する限り、check
(「コードを変更する」ことなく) コードを変更し、必要な種類の機能を取得できます。