表达式使用Each, like f¨x
,可以表示为Rank as {⊂f⊃⍵}⍤0⊢x
(注意⊢
是分隔数组右操作数,0
来自数组右参数x
)。换句话说,在参数的标量上,我们:
- 公开标量:
⊃⍵
- 应用函数:
f⊃⍵
- 附上结果:
⊂f⊃⍵
类似的表达式适用于二元情况,x f¨y
,但我们需要:
- 公开两个标量:
(⊃⍺)
…(⊃⍵)
- 应用函数:
(⊃⍺)f(⊃⍵)
- 附上结果:
⊂(⊃⍺)f(⊃⍵)
这给了我们x{⊂(⊃⍺)f(⊃⍵)}⍤0⊢y
。因此我们可以使用Rank建立我们自己的Each允许派生函数的一元和二元应用的运算符:
Each←{⍺←⊢ ⋄ ⍺ ⍺⍺{×⎕NC'⍺':⊂(⊃⍺)⍺⍺(⊃⍵) ⋄ ⊂⍺⍺⊃⍵}⍤0⊢⍵}
(¯10↑Each(⊂dummytxt),Each⍕Each rfikv),Each⊂texttoadd
defghijk20down defghijk30down defghijk50down
或者,我们可以将两个更简单的等价替换为您的表达式:
(¯10{⊂(⊃⍺)↑(⊃⍵)}⍤0⊢(⊂dummytxt){⊂(⊃⍺),(⊃⍵)}⍤0{⊂⍕⊃⍵}⍤0⊢rfikv){⊂(⊃⍺),(⊃⍵)}⍤0⊂texttoadd
defghijk20down defghijk30down defghijk50down
请注意,我们正在附上texttoadd
所以它变成标量,然后我们使用⍤0
解决整个标量,只是再次公开它。相反,我们可以使用⍤0 1
说想用整个vector应用该函数时的正确参数,而该函数又不需要公开其正确参数:
(¯10{⊂(⊃⍺)↑(⊃⍵)}⍤0⊢(⊂dummytxt){⊂(⊃⍺),(⊃⍵)}⍤0{⊂⍕⊃⍵}⍤0⊢rfikv){⊂(⊃⍺),⍵}⍤0 1⊢texttoadd
defghijk20down defghijk30down defghijk50down
rfikv
and ¯10
是一个简单的标量,因此公开它们没有任何效果:
(¯10{⊂⍺↑(⊃⍵)}⍤0⊢(⊂dummytxt){⊂(⊃⍺),(⊃⍵)}⍤0{⊂⍕⍵}⍤0⊢rfikv){⊂(⊃⍺),⍵}⍤0 1⊢texttoadd
defghijk20down defghijk30down defghijk50down
dummytxt
情况与texttoadd
上面,但作为左参数,所以我们可以跳过 enclose-disclose 并要求 Rank 使用整个向量左参数;⍤1 0
:
(¯10{⊂⍺↑(⊃⍵)}⍤0⊢dummytxt{⊂⍺,(⊃⍵)}⍤1 0{⊂⍕⍵}⍤0⊢rfikv){⊂(⊃⍺),⍵}⍤0 1⊢texttoadd
defghijk20down defghijk30down defghijk50down
这与使用通用方法一样简单。然而,如果我们观察到唯一的非标量是rfikv
,我们可以治疗dummytxt
and texttoadd
作为全局常量并将整个事物表达为单个⍤0
函数应用在rfikv
:
{⊂(¯10↑dummytxt,⍕⍵),texttoadd}⍤0⊢rfikv
defghijk20down defghijk30down defghijk50down
当然,Each也可以这样做:
{(¯10↑dummytxt,⍕⍵),texttoadd}¨rfikv
defghijk20down defghijk30down defghijk50down