在不冒复制风险的情况下安全地层压 J 中的字符串

Safely laminate strings in J without risking replication

如果你层压 (,:) 个具有多个字符的字符串,你会得到一个很好的填充数组:

   x =: 'x'
   y =: 'yolo'
   z =: 'zebra'
   y ,: z
yolo 
zebra

如果层压单个字符,则复制标量:

   y ,: x
yolo
xxxx

您可以通过使用 $:

将标量转换为向量来避免这种情况
   y ,: 1$ x
yolo
x   

但如果你是瞎子,那就不太好了:

   y ,: 1$ z
yolo
z   

是否有一种简单直接的方法来层压字符串 x 和 y,而无需提前知道其中一个是否只有一个字符长?

添加一个轴,,层压前:

y,:,x
yolo
x   

y,:,z
yolo 
zebra

f=: ,: & ,当只有 2 个字符串时工作正常,但是当有多个字符串时,ravel 感觉不太对。

   f=: ,: & , 
   'yellow' f 'x'
yellow
x     
   'yellow' f 'x' f 'blue'
yellow  
x   blue

出于这个原因,我更喜欢引入一个动词来强制两个参数都排在第 2 位。然后你可以使用 append 而不是 laminate。

   d2=: 13 : '(_2{. 1 1,$y)$,y'
   g=: ,&d2

   'yellow' g 'x'
yellow
x     
   'yellow' g 'x' g 'blue'
yellow
x     
blue