3

我在玩 J 中的副词和连词,遇到了一个奇怪的问题。我定义了一个简单的副词,叫做persistence它可以用来查看在计算数字乘积或数字的数字总和时生成的数字的进程。

S =: 1 : 'u/@:("."0)@":^:a:"0'

+ S 234给我们234 9。然后我用它来创建另一个副词来计算数字的持久性。

P =: 1 : '<:@#@(u S)"0'

+ P 234给我们1。现在,假设我们想要找到所有低于 30 且附加持久性为 2 的数字,然后查看S为每个数字生成的列表,例如,

+ S I. 2 = + P i.30

这会生成以下列表:

19 10 1
28 10 1
29 11 2

到目前为止,一切都很好。现在,我想把它变成一个连词,它的左侧包含用于持久性的动词,而右侧包含用于限制列表的数字。(2在上面的例子中。)这是我对那个连词的定义:

Q =: 2 : 'u S I. n = u P'

如果我在 J 控制台中输入表达式+ Q 2,我会得到以下信息:

+/@:("."0)@":^:a:"0 I. 2 = <:@#@(+/@:("."0)@":^:a:"0)"0

这是完全正确的,如果我使用诸如 的参数运行完整的表达式i.30,它可以正常工作:

+/@:("."0)@":^:a:"0 I. 2 = <:@#@(+/@:("."0)@":^:a:"0)"0 i.30

但是,当我将表达式输入+ Q 2 i.30J 控制台时,我得到一个“长度错误”。为什么?!不+ Q 2完全等同于+/@:("."0)@":^:a:"0 I. 2 = <:@#@(+/@:("."0)@":^:a:"0)"0?

我完全被难住了。我错过了什么?我在连词的定义内部和外部都玩过排名。我只是不明白。

4

1 回答 1

3

+ Q 2完全等同于您提供的表达式,但是在表达式中使用它时,就好像它在括号中。

   +/@:("."0)@":^:a:"0 I. 2 = <:@#@(+/@:("."0)@":^:a:"0)"0 i.30
19 10 1
28 10 1
29 11 2
   (+/@:("."0)@":^:a:"0 I. 2 = <:@#@(+/@:("."0)@":^:a:"0)"0) i.30
|length error

一般来说f g h y!= (f g h) y。在后者中f g h定义了一个train。例如:

   avg=: +/ % #
   +/ % # 1 2 3
0.333333
   (+/ % #) 1 2 3
2
   avg 1 2 3
2

您可以通过像这样添加对 y 的引用来修复您的连词:

   Q=: 2 : 'u S I. n = u P y'
   + Q 2 i.30
19 10 1
28 10 1
29 11 2
于 2011-08-14T03:54:56.423 回答