如何在 J lang 中互换使用任意选择器?

How to use arbitrary selector in interchange in J lang?

假设我们有一个如下所示的向量和矩阵:

   r =: 100 + 5 5 $ i.25
   r
100 101 102 103 104
105 106 107 108 109
110 111 112 113 114
115 116 117 118 119
120 121 122 123 124

   v =: 100 + 5 $ i.5
   v
100 101 102 103 104

现在我想要一种方法来交换选择器指定的片段。 我知道如何兑换物品:

   (<0 _1) &C. v
104 101 102 103 100

这里我交换了索引=0 和索引=-1 的元素。 在矩阵的情况下,行(项目)被更改:

   (<0 _1) &C. r
120 121 122 123 124
105 106 107 108 109
110 111 112 113 114
115 116 117 118 119
100 101 102 103 104

但是如果我想指定两个任意选择呢?我所追求的例子:

   sel1 =: (< (<0 1))
   sel1 { v
100 101
   sel2 =: (< (<2 3))
   sel2 { v
102 103

   sel1 sel2 INTERCHANGE v
102 103 100 101 104

矩阵也一样:

   sel1 =: (< (<0 1),(<0 1))
   sel1 { r
100 101
105 106
   sel2 =: (< (<3 4),(<1 2))
   sel2 { r
116 117
121 122
   sel1 sel2 INTERCHANGE r
116 117 102 103 104
121 122 107 108 109
110 111 112 113 114
115 100 101 118 119
120 105 106 123 124

所以我的问题是如何优雅地定义使用两个选择的互换?

我想我会先创建两个选择,然后使用修改来交换它们。可能不是最优雅或最通用的,但如果您知道要更改的选择并且它们的形状相同,它确实有效。

   r
100 101 102 103 104
105 106 107 108 109
110 111 112 113 114
115 116 117 118 119
120 121 122 123 124
     [rep=:((<3 4;1 2),(<0 1;0 1)) {  r  NB. rep is the selected replacement values
116 117
121 122

100 101
105 106
   ((<0 1;0 1),(<3 4;1 2)){ r  NB. values that will be replaced (just a check that they are the same shape)
100 101
105 106

116 117
121 122
  rep ((<0 1;0 1),(<3 4;1 2))} r  NB. Select verb ({) changed to Amend adverb (})
116 117 102 103 104
121 122 107 108 109
110 111 112 113 114
115 100 101 118 119
120 105 106 123 124