Я пытаюсь создать функцию в q/kdb+, которая может определить, является ли строка, переданная функции, в верхнем регистре (истина) ИЛИ в нижнем регистре (ложь)
Я сделал несколько попыток, но я постоянно натыкаюсь на блокпост Вот моя функция, буду признателен за помощь. ТИА
isAllCaps: {[input] if[input = lower; show 0b; show 1b]}
Вышеупомянутая функция в основном принимает ввод, как указано. Затем он проверяет из оператора if, является ли он ниже, если он ниже, то он должен вернуть ложь (0b
), если нет, то вернуть истину (1b
). Действительно борется с чем-то настолько простым здесь. Я просто получаю следующую ошибку:
evaluation error:
type
[1] isAllCaps:{[input] if[input = lower; show 0b; show 1b]}
^
[0] isAllCaps"a"
Я также пробовал другие методы, но только определенные входы были успешными. Например:
isAllCaps: {[x] if[ x = upper type 10h; show 1b; show 0b]}
Это равносильно тому, что если x является строкой верхнего типа, показать true, иначе показать false. Опять получаю ошибку типа. Почему? Все тесты представлены в виде строк, например, «John_Citizen» и т. д. и т. д.
РЕДАКТИРОВАТЬ Пробовал это, но я получаю 2 выхода.
isAllCaps: {[L] if[L = lower L; show 0b; show 1b] } Am I missing something?
Кажется, теперь это работает, но не работает со строками, содержащими более одного символа isAllCaps:{[L] if[L = lower L; показать 0b] если[L = верхний L; показать 1b]}
Попробуйте следующий код:
isAllCaps: {[L] show L~upper L};
Он показывает 1b
, если строка в верхнем регистре, и 0b
в противном случае.
В вашем коде 2 ошибки
~
следует использовать для сравнения строк. =
выполняет сравнение персонажей. т.е. "aa"~"aa"
дает 1b
, но "aa" = "aa"
дает 11b
if-else
вместо if
. Дополнительные сведения см. в статье 10.1.1 Базовая условная оценка.Большое спасибо! Да, код, который вы мне дали, работает! Как бы я использовал if-else? Однако я проверил это на главной странице и немного запутался :|
show
отображает результат, а также возвращает его; вполне можно было бы опустить.
Управляющее слово if
лучше всего зарезервировать для побочных эффектов, таких как сигнализация об ошибке. Там, где требуется результат, лучше использовать троичное условное выражение Конд., которое возвращает результат. Но в этом случае тест является требуемым результатом и может быть просто возвращен — неявно без необходимости show
.
Вы можете использовать встроенный заглавный алфавит .Q.A
для достижения желаемого:
{all x in .Q.A}
Эта лямбда вернет 1b
, если входная строка состоит только из заглавных букв, и false в противном случае.
Оцените логику, но она не будет работать со строками типа «AAA_123» с числами и всем остальным. А в остальном хорошая штука!
Начните с устранения некоторых недоразумений.
lower
возвращает нижний регистр своего аргумента.show
отображает и возвращает свой результат. Вы можете использовать его, так как вы должны обеспечить вывод результата функции на консоль, но это не обязательно, как, например, return
в JavaScript.~
, а не РавноТем не менее, две стратегии: проверить символы нижнего регистра .Q.a
или преобразовать в верхний регистр и посмотреть, есть ли разница.
q){not any x in .Q.a}"AAA_123"
1b
q){not any x in .Q.a}"AaA_123"
0b
Вторую стратегию вряд ли можно было бы написать проще:
q){x~upper x}"AaA_123"
0b
q){x~upper x}"AAA_123"
1b
Вместе с оператором Применять.
конструкция Дзен монахи дает вам быстрый «бесточечный» код — нет необходимости в лямбде:
q).[~] 1 upper\"AaA_123"
0b
q).[~] 1 upper\"AAA_123"
1b
isAllCaps: {[L] if[L = нижний L; показать 0b]; show 1b } Кажется, это дает лучшие результаты, но в случае более низкого char выдает 0 и 1