问题描述
在.[0!y;();xcols x]
中看到的功能应用方法xkey
和有什么区别:
xkey
k){(#x)!.[0!y;();xcols x]}
为什么函数在xkey
中优先使用?
还有第二个问题,涉及从xcols
上下文内部调用k)
的情况-它是如何工作的?由于某些原因,我无法执行此操作:
t:([]a:`a`s`d;b:1 2 3;c:4 5 6)
k).[0!t;();xcols `a`b]
ERROR: 'xcols
(attempt to use variable xcols without defining/assigning first (or user-defined signal))
解决方法
我认为该功能适用于按名称传递表的情况
t:([]a:`a`s`d;b:1 2 3;c:4 5 6)
.[0!t;();xcols[`a`b]] /this works
`a`b xcols 0!t /equivalent non functional form works
q)`a`b xcols 0!`t /this fails when passing `t
'type
[0] `a`b xcols 0!`t
q).[0!`t;();xcols[`a`b]] /though functional form still works with `t
q)`a`b xkey `t /hence you can use xkey in place
`t
编辑: 为了使我的评论完整,在k内时,应在q命令前面加上.q来访问它们,因为这是它们所在的名称空间
q)xcols[`a`b]
k){(x,f@&~(f:cols y)in x)#y}[`a`b]
q)\
.q.xcols`a`b
k){(x,f@&~(f:cols y)in x)#y}[`a`b]
编辑2: 为了解决您的评论,示例的xcols归结为
`a`b`c#t
和
`a`b`c#`t
不起作用。我对它为什么不起作用没有太多解释,除了它是如何设计的。函数形式是告诉q通过应用take函数修改表。但是,上面的示例不是用于重新定义表以对其列进行重新排序的公认语法。