默写 `4 : '$ x (<") y'`

Write `4 : '$ x (<") y'` tacitly

如何写默认的frame函数? (来自《学习杂志》第 7 章)

我正在使用第 8 章的 f x g y = x f@:g y 构图方案,但它不起作用。我的猜测是因为 <" 没有自然排名?

x=.1
y=.i.2 3 4
f=.$
g=.<"

frame_e=.4 :'f x g y'
frame_t=.f@:g
x frame_e y         NB. -> 2 3, which is the x-frame of y
x frame_t y         NB. -> domain error

NB. No natural rank
g b.0               NB. -> syntax error
0 g b.0             NB. -> 0 0 0

我确认该模式与我预期的其他功能一样有效。

x=.1
y=.i.2 3 4
f=.+/
g=.*

f x g y             NB. -> equiv of 12+2*i.3 4
x f@:g y            NB. -> same

默认情况下,我会使用

   framet=. {. $
   2 framet i. 2 3 4
2 3

但这并没有真正触及您问题的根源,对吗?

问题确实是 g 的定义方式:

g=.<"

这不会使 g 成为动词,而是成为副词。它确实使用显式定义中的 x 来创建动词,但它需要在使用该动词计算 y 之前执行此操作。据我所知,J 不允许您暂存这些过程。如您所见,当 fg 实际上是动词时,该模式确实有效。

我发现隐式编程很优雅,但它在某些方面可能会更慢,而且在某些方面它是有限的。

希望有人能给出更好的答案,这样我也可以学习。