1

试图理解这个函数的作用:

yr:{ yr:.z.T+1000*x; -1 string .z.Z; while[(.z.T < yr); ZZ,::.z.Z]}

我知道 .zZ 获取日期时间,并且执行是从右到左。什么是ZZ?什么是.zT?

本质上,这条线完成了什么?

4

4 回答 4

1

对此进行了更好的重写,以使其更加惯用。它利用了\迭代的重载。查看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。

于 2014-04-30T21:41:28.850 回答
1
  • .z.T是数据类型中的当前时间time;s 中的基础数字time是自午夜以来的毫秒数,因此添加1000*x会给出x未来的时间秒数。

  • -1 string .z.Z将当前打印datetimestdout.

  • while[(.z.T < yr); ..]只要当前时间小于yrx未来的秒数),就会循环。

  • 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]}.

于 2014-04-30T22:30:03.360 回答
1
  • 这里 :: 表示将右边的值赋给左边的全局变量
  • ZZ 是一个全局变量
  • ZZ,::.zZ 是 ZZ::ZZ,.zZ 的简写,因此它将最新时间附加到全局变量 ZZ。

例如

q)f:{ZZ,::2}
q)f[]
q)ZZ
,2
q)f[]
q)ZZ
2 2

.zT 是时间。

于 2014-04-18T06:05:49.730 回答
0

此函数在做什么:
此函数接受一个参数(应该是 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(未来时间),循环将结束。

  • 最后,您将拥有可以使用 variable 访问的全局列表 ZZ
于 2014-04-21T07:27:49.923 回答