试图理解这个函数的作用:
yr:{ yr:.z.T+1000*x; -1 string .z.Z; while[(.z.T < yr); ZZ,::.z.Z]}
我知道 .zZ 获取日期时间,并且执行是从右到左。什么是ZZ?什么是.zT?
本质上,这条线完成了什么?
对此进行了更好的重写,以使其更加惯用。它利用了\
迭代的重载。查看http://code.kx.com/q/ref/adverbs/#converge-iterate
您拥有的当前函数采用当前时间 ( .z.T
) 并添加x
秒数(乘以 1000 使其为毫秒)。这成为您的界限,然后只要当前时间小于该时间,您就将.z.Z
(日期时间标记)附加到全局列表ZZ
。
下面的版本会做同样的事情,但有几个优点:避免使用全局并且编写更惯用的代码
f2:{{.z.Z}\[{y; .z.T<x}.z.T+1e3*x; .z.Z]}
当您的条件{y; .z.T<x}.z.T+1e3*x
为真时,您的循环将继续迭代。请注意,我们确保从外部传入时间限制,以便每次都不会重新评估它,另外我们需要一个虚拟参数y
,因为它会尝试将此条件应用于我们的迭代结果,但我们没有t真的想要那个,因为那是.z.Z
。每次迭代时,它都会评估.z.Z
返回日期时间。由于您正在使用\
而不是/
您将生成整个列表。
q)f2:{{.z.Z}\[{y; .z.T<x}.z.T+1e3*x; .z.Z]}
q)f2 1
2014.04.30T17:40:23.357 2014.04.30T17:40:23.357 .......
话虽如此,如果您希望从现在到现在 + x 生成一系列日期时间值,这不是最好的方法,因为您的.z.Z
标记将反映您的机器实际评估它所花费的时间。
更正:我没有正确解释我们的条件测试 lambda 的原因{y; .z.T<x}.z.T+1e3*x
。你想确保你.z.T+1e3*x
只在开始时被评估,所以你不希望你的绑定在函数内部。此外,如果您要省略该y
参数,则 then{z.T<x}.z.T+1e3*x
将立即评估为 false,并且您的迭代将返回type
错误,因为它试图将您的迭代结果应用于0b
循环的每个循环。通过保留y
而不使用它,我们确保延迟此评估并创建一个正确测试我们的界限的 lambda。
.z.T
是数据类型中的当前时间time
;s 中的基础数字time
是自午夜以来的毫秒数,因此添加1000*x
会给出x
未来的时间秒数。
-1 string .z.Z
将当前打印datetime
到stdout
.
while[(.z.T < yr); ..]
只要当前时间小于yr
(x
未来的秒数),就会循环。
ZZ,::.z.Z
将当前附加datetime
到名为ZZ
.
一些附加说明:
该datetime
数据类型通常不赞成使用timestamp
.
测试条件周围的括号是多余的。
第二个:
也是多余的,但出于更有趣的原因:(,:
就像所有双参数“写回”函数(x+:1
,y-:2
等))总是修改全局变量或局部变量,具体取决于该名称的局部变量是否存在在函数中。
证明:
q)delete from`.;
q){ZZ:(); yr:.z.T+1000*x; -1 string .z.Z; while[(.z.T < yr); ZZ,::.z.Z]}1
2014.04.30T18:26:24.592
q)ZZ
'ZZ
q)
在该版本的函数的 while 循环内被修改的是在第一个语句中声明的局部变量,而不是假设修改语句中ZZ
存在 a 的全局变量。::
无论如何,如果您想这样做,至少应该将其重写为yr:{ yr:.z.T+1000*x; -1 string .z.Z; while[.z.T < yr; ZZ,:.z.Z]}
.
例如
q)f:{ZZ,::2}
q)f[]
q)ZZ
,2
q)f[]
q)ZZ
2 2
.zT 是时间。
此函数在做什么:
此函数接受一个参数(应该是 int)并将这些秒数添加到当前时间(可以说是未来时间)。然后它开始一个从当前时间到未来时间的循环,并且在每次迭代中,将当前日期和时间附加到全局列表(由变量 ZZ 引用)。
如何打电话:yr[2]
解释:
yr:.z.T+1000*x
.z.T
给你当前的当地时间。
1000 相当于 1 秒。因此,它将 x 秒添加到当前时间并将其存储在变量 yr 中。( :
表示赋值 (=))
ZZ,::.z.Z
::
用于给全局变量赋值。ZZ
一个全局变量也是列表(如数组)。
,
用于追加。上面的语句相当于ZZ : ZZ , .z.Z
.z.Z
给出当前的本地日期和时间。
while[(.z.T < yr);...]
这是循环的条件。所以它需要当前时间(.z.T
)并检查它是否小于在第一个语句中计算的未来时间。
一旦当前时间=yr(未来时间),循环将结束。
ZZ
。