将 trap 与 KDB 和未声明的变量一起使用?

Using trap with KDB and non-declared variables?

举例来说,我正在尝试在 x 不存在的地方进行 try-catch:

@[x;::;"error"]

我收到 'x 错误,而不是 "error"。我做错了什么?

您可以使用 value 关键字来确定变量是否存在。错误捕获这可能是您要查找的内容?

q)@[value;`x;"error"]
"error"
q)x:12
q)@[value;`x;"error"]
12

在此处查看文档 https://code.kx.com/q/ref/apply/#trap “在三元中,如果函数求值失败,则对表达式求值”

无法计算函数 x,因为它不存在。该函数在这里没有失败,只是无法调用。这里的提示是在评估中——我们可以使用值来检查函数是否存在。

q)f:{x+x}
q)@[value;`f;"error"]
{x+x}
q)@[value;`p;"error"]
"error"

已定义函数 f 的 returns 值与未定义的值 p >

q)value f
0x6161410003
,`x
`symbol$()
,`
5 3 4 2 2
"..f"
""
-1
"{x+x}"
q)value p
'p
  [0]  value p
             ^

请注意,仅当您要检查的变量是全局变量时,在变量名称上使用 value 才有效,它不适用于局部变量:

q){@[value;`v;"error"]}[]
"error"
q){v:9;@[value;`v;"error"]}[]
"error"

虽然实际上在大多数情况下您会寻找一个全局的,所以这会起作用。

如果您要找的是本地人,那么事情会变得有点乱七八糟,但技术上是可行的:

q){locals:?[(`$())!();();();{x!x}raze(value .z.s)1 2];$[`v in key locals;locals`v;'"error"]}[]
'error

q){v:9;locals:?[(`$())!();();();{x!x}raze(value .z.s)1 2];$[`v in key locals;locals`v;'"error"]}[]
9