Давайте определим deparse
1 как операцию обратную к собственной операции parse
q, чтобы выполнялось следующее:
q)aStringQExpression~deparse parse aStringQExpression
1b
Вопрос
Каково определение функции deparse
, чтобы вышеизложенное действительно работало?
Например, в приведенном ниже выражении обновления мы знаем, что выражение "a*0^b+c-d"
соответствует дереву синтаксического анализа (*;`a;(^;0;(+;`b;(-;`c;`d))))
:
q)-3!parse "update col:a*0^b+c-d from t"
"(!;`t;();0b;(,`col)!,(*;`a;(^;0;(+;`b;(-;`c;`d)))))"
Таким образом, предполагаемая функция deparse
должна возвращать:
q)deparse "(*;`a;(^;0;(+;`b;(-;`c;`d))))"
"a*0^b+c-d"
q)deparse "(!;`t;();0b;(,`col)!,(*;`a;(^;0;(+;`b;(-;`c;`d)))))"
"update col:a*0^b+c-d from t"
Мотивация/предыстория/вариант использования: встроенные выражения, возможно, быстрее, чем человеческим глазом (слева направо), чем глубоко вложенные деревья синтаксического анализа. Хотя в фоновом режиме мой код программно редактирует дерево синтаксического анализа, для отладки или презентации удобно преобразовать полученное дерево синтаксического анализа в строку встроенного выражения.
1 Аналогичные функции описаны здесь: http://adv-r.had.co.nz/Expressions.html#parsing-and-deparsing