Hi all.
Background: есть собственный скриптовый язык, у пользоветеля есть доступ только к выражениям (expression) вроде 'A > B and foo(C, D) = 10'. Есть основной набор типов : числа, строки, даты, операции над ними и функции.
На текущий момент оператор сравнения(=) сравнивает строки с учетом регистра. Возникла необходимость сравнивать без учета регистра (на текущий момент проблема решается с помощью ToUpper/ToLower). Загвоздка в том что это должно выглядеть как можно проще. Придумались такие варианты:
int Compare(string, string, bool ignoreCase)
int CompareNoCase(string, string)
bool Equal(string, string, bool ignoreCase)
bool operator OP (string, string), где OP - некий оператор(какой выбрать ?),
предназначенный именно для такого сравнения.
Ни один из вариантов особо не нравится:
Compare — все-таки выполняет больше чем просто сравнение,
Новый оператор — неочевидно (или нет?)
Склоняюсь к Equal, но он пересекается с существующим оператором сравнения
Возможно есть другие варианты ? другие имена функций, что-то еще... Сложность реализации второстепенна.
Re[2]: Сравнение строк без учета регистра в скриптах
От:
Аноним
Дата:
24.01.09 11:28
Оценка:
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
A>Что касается нового оператора, то в скриптовых языках уже давно есть операторы =, !=, ==, !==, ===, !===.
Первые два у меня тоже есть уже давно... Для чего применяются другие (!==, ===, !===) ?
A>А при желании можно придумать много других
Это запросто. Вопрос в читабельности и логичности. Согласитесь, такое не очень понятно: 'Str ^@&@^ "Qwerty"'
Re[3]: Сравнение строк без учета регистра в скриптах
Здравствуйте, Аноним, Вы писали:
A>>А при желании можно придумать много других А>Это запросто. Вопрос в читабельности и логичности. Согласитесь, такое не очень понятно: 'Str ^@&@^ "Qwerty"'
Здравствуйте, Аноним, Вы писали:
A>>А при желании можно придумать много других А>Это запросто. Вопрос в читабельности и логичности. Согласитесь, такое не очень понятно: 'Str ^@&@^ "Qwerty"'
a ^= b /* uppercase comparsion */
a v= b /* lowercase comparsion */
Русский военный корабль идёт ко дну!
Re[4]: Сравнение строк без учета регистра в скриптах
AG>a ^= b /* uppercase comparsion */
AG>a v= b /* lowercase comparsion */
AG>
Тогда лучше =\ (lowercase), =/ (uppercase), !=\, !=/ — чтобы не мешать буквы с пунктуацией.
Кстати, в некоторых языках ввести свои операторы — раз плюнуть. Пролог, Хаскел, я уже молчу про Форт и Лисп.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[2]: Сравнение строк без учета регистра в скриптах
Здравствуйте, adontz, Вы писали:
A>Я подумал, оператором нельзя. Помимо строк, есть ещё и язык, в рамках которого мы считаем конкретными символы разными регистрами одной буквы.
Ну, какая разница — инфиксная или префиксная запись вызова.
И пусть поведение зависит от глобальных настроек.
Ведь в конечном счёте не программист для языка, а язык для программиста. Если удобно, что поведение оператора сравнения текстов зависит от локали — так тому и быть.
В перле же, например, не поленились затащить регекспы глубоко в синтаксис.
Вот если окажется, что есть слишком много разных (часто используемых) вариантов сравнения, да ещё выбираемых в рантайме — то конечно, на всех их не напасёшься инфиксных операторов.
Тут уже функции с дополнительными аргументами будут рулить.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[3]: Сравнение строк без учета регистра в скриптах
Здравствуйте, Кодт, Вы писали:
К>Ну, какая разница — инфиксная или префиксная запись вызова. К>И пусть поведение зависит от глобальных настроек. К>Ведь в конечном счёте не программист для языка, а язык для программиста. Если удобно, что поведение оператора сравнения текстов зависит от локали — так тому и быть. К>В перле же, например, не поленились затащить регекспы глубоко в синтаксис.
Практика показывает, что такое использование глобальных настроек, а именно наличие неявной зависимости от них, приводит к созданию программ класса "Works on my machine only".
Здравствуйте, ekamaloff, Вы писали:
E>А что, результат "uppercase comparison" и "lowercase comparison" может быть разный?
В принципе, да. Например, в греческом языке есть одна заглавная сигма Σ и две строчных (концевая ς и не-концевая σ ). А в немецком — строчный эсцет ß, которому соответствуют заглавные SS или SZ.
Перекуём баги на фичи!
Re[4]: Сравнение строк без учета регистра в скриптах
Здравствуйте, adontz, Вы писали:
A>Практика показывает, что такое использование глобальных настроек, а именно наличие неявной зависимости от них, приводит к созданию программ класса "Works on my machine only".
О, это повсеместно. Достаточно заложиться на текущую локаль. И даже явно её указать — например, микрософтовские алиасы кодировок CP_ACP, CP_OEM.
Перекуём баги на фичи!
Re[4]: Сравнение строк без учета регистра в скриптах
Здравствуйте, Alexander G, Вы писали:
AG>a ^= b /* uppercase comparsion */ AG>a v= b /* lowercase comparsion */
Фу, еще больший отстой, чем метод CompareNoCase.
В С++ я сделал так:
if (nickname == IgnoreCase(id))
Даже студенты-стажеры, понятия не имеющие как это работает, понимают и применяют без единого вопроса.
По крайней мере в питоне точно можно вернуть такой же временный объект, реагирующий на оператор сравнения и вызывающий что надо. Многие хорошие скрипты и нескрипты тоже должны такое позволять.