Как найти валентность функции kdb

#kdb

Вопрос:

Есть ли способ найти валентность (ранг) функции в q?

т. е. я ищу функцию v такую, чтобы

 v[{42}] gives 0
v[{x*x}] gives 1
v[{x y}] gives 2
 

и т.д.

Ответ №1:

То, что ты хочешь сделать, это

 q)f:{x y z}
q)/the second item returned by value f is the args of f, so we simply count them.
q)value f
0x63624161410003
`x`y`z  <--- args of f
`symbol$()
,`
7 5 6 3 4 2 2
"..f"
""
-1
"{x y z}"
q)count value[f]1
3

q)/ wrap it in a function
q)v:{count value[x]1}
 

(хотя следует отметить, что ниладическая функция, подобная {42} , все равно будет показывать 1 параметр, x )
смотреть ниже:
https://code.kx.com/q/ref/value/#lambda

Комментарии:

1. Спасибо: это то, что мне было нужно. Я хочу, чтобы это было для некоторой динамической логики отправки, в которой я использую apply. Я вижу, что для ниладической функции мне все равно нужно передать атом для применения (в идеале, заручиться [::]), поэтому мне на самом деле нужно, чтобы 1 был возвращен из моей функции вычисления валентности, так что ваше решение лучше, чем я просил!