Применение наречий к оператору двоеточия - PullRequest
1 голос
/ 02 мая 2020

Пожалуйста, помогите мне с оператором двоеточия :, я застрял на том, как это работает. Он работает как присваивание, присваивание через x+:1, глобальное присваивание / просмотр ::, I / O 0:, 1:, для возврата значения из середины функции :r и получения унарной формы оператора #:.

Но что произошло, если применить к нему наречие? Я пробовал так:

$ q
KDB+ 3.6 2019.04.02 Copyright (C) 1993-2019 Kx Systems
q)(+')[100;2 3 4]
102 103 104
q)(:')[x;2 3 4]
'x
  [0]  (:')[x;2 3 4]
            ^
q)(:')[100;2 3 4]
2 3 4

Я ожидаю оценки в следующем порядке: x:2, затем x:3, затем x:4. Чтобы получить x:4 в результате. Но у меня есть ошибка. А также :' работает с числом 100 по неизвестной причине.

Что на самом деле делает :'

q)parse "(:')[100;2 3 4]"
(';:)
100
2 3 4

Разбор не пролил много света на меня, поэтому я прошу вашей помощи.

1 Ответ

3 голосов
/ 03 мая 2020

При изменении итератором (также известным как наречие в языке q), : ведет себя так же, как любой другой бинарный оператор. В вашем примере

q)(:')[100;2 3 4]
2 3 4

атом 100 расширяется до соответствующего списка 100 100 100, а затем : применяется к элементам двух списков попарно. Окончательный результат возвращается. Это может выглядеть странно (: пытается изменить постоянное значение, правда?), Но если вы сравните это с любым другим двоичным оператором и заметите, что они никогда не изменяют свои операнды, но возвращают результат выражения, все должно нажмите на место.

Например, сравните

q)+'[100; 2 3 4]
102 103 104

и

q)(:')[100;2 3 4]
2 3 4

В обоих случаях неявно создается временный вектор 100 100 100, а оператор применяется к нему и 2 3 4. Таким образом, первое семантически эквивалентно

(t[0]+2;t[1]+2;t[2]+4)

, а второе

(t[0]:2;t[1]:2;t[2]:4)

, где t - это временный вектор.

Это объясняет, почему (:')[x;2 3 4] выдает ошибку - если x не существует, kdb не может расширить его до списка.

...