如何查询kdb及q语言中函数的秩(valence)?
如何查询Q语言中函数的秩(Valence/Rank)
你要找的获取函数秩的方法在Q语言里其实挺直接的,有两种简洁的方式能实现你想要的函数v,我给你一步步说明:
方法一:使用内置的args函数(推荐)
Q语言自带了args函数,它会直接返回函数的参数符号列表。我们只需要对这个列表取长度,就能得到函数的秩。
定义你的目标函数v非常简单:
v:count@args
来测试你给出的几个例子:
q)v[{42}] // 无参数的匿名函数 0 q)v[{x*x}] // 单参数的匿名函数 1 q)v[{x+y}] // 双参数的匿名函数 2
这个方法同样适用于命名函数,比如你定义一个加法函数:
q)addTwo:{x+y} q)v[addTwo] 2
方法二:通过解析函数AST实现
如果你想手动拆解函数的结构,可以用parse函数获取函数的抽象语法树(AST),然后提取参数部分的长度。对应的函数v可以这么写:
v:{count 1_(-1_)parse x}
这里的逻辑是:parse返回的AST中,参数部分位于从第二个元素到倒数第二个元素的区间,我们用1_(-1_)截取这部分内容,再用count统计参数的数量。测试结果和方法一完全一致:
q)v[{42}] 0 q)v[{x*x}] 1 q)v[{x+y}] 2
小提示
这两种方法都是针对固定参数的函数设计的。如果是可变参数函数(比如用...定义的函数),args会返回特殊符号::,这种场景你可能需要额外处理,但从你的需求描述来看,固定参数的场景应该已经完全满足你的需求了。
内容的提问来源于stack exchange,提问作者Tony Halse
相关产品推荐
相关产品推荐

