(kdb+/q) добавить в словарь

Я пытаюсь программно создать аргументы для вызова functional select, имеющего форма:

?[ `t; () ; groupBy; ()]

Проблемной частью является groupBy, который должен быть словарем.

Предположим, что цель состоит в том, чтобы получить дерево синтаксического анализа в виде:

parse "select by sym,month:`date$dt.month from t"

Я начинаю строить часть by с:

groupBy: enlist[`sym]!enlist(`sym)

Затем я пытаюсь добавить month часть группы оператором (обратите внимание, что периодичность параметризована):

per: `month / monthly periodicity
groupBy,: {enlist[x]!enlist[ $[x = `day; 
                               `dt; 
                               $[x=`month;
                                 ((parse "select by month:`date$dt.month from x")@3)@`month
                                 ;` sv (`dt,x)]
                               ]]
          }[per]

Однако это выдает ошибку type. Что пойдет не так?


person Daniel Krizian    schedule 12.05.2015    source источник
comment
Я думаю, что составное присваивание groupBy,:{...} ему не нравится. Попробуйте groupBy:groupBy,{...}   -  person terrylynch    schedule 12.05.2015
comment
Действительно, groupBy:groupBy,{...} работает. Странно, как я думал, что они эквивалентны. Большое спасибо! Не могли бы вы скопировать это в ответ, и я приму его.   -  person Daniel Krizian    schedule 12.05.2015


Ответы (1)


Я думаю, что это не нравится составное задание

groupBy,:{...} 

Пытаться

groupBy:groupBy,{...}

Разница в том, что в первом случае он пытается напрямую изменить данные в памяти, не создавая копию, тогда как во втором случае он создает копию данных в памяти, а затем переназначает ее этой переменной. Возможно, составное присваивание работает только тогда, когда типы однородны.

person terrylynch    schedule 12.05.2015
comment
Я думаю, что это из-за разницы типов в значении groupy и нового временного словаря. Согласно вики: Amend применяет строгое сопоставление типов с простыми списками, поскольку результат должен быть помещен обратно в список. значение (groupby) имеет тип списка символов, а новый словарь имеет общий тип. Если вы сделаете это в обратном порядке (temp dict,:groupby), это сработает, но результаты могут быть другими. - person Rahul; 12.05.2015