如何从J中的数组创建一个动名词?

tan*_*orm 3 j

在J中,我们可以"_用来产生一个常数函数:

   k100 =. 100"_
   k200 =. 200"_
Run Code Online (Sandbox Code Playgroud)

这些可用于与其他动词的动名词:

   (+:`k100`k200`-:)`:0 [ 256
512 100 200 128
Run Code Online (Sandbox Code Playgroud)

如何直接从数组创建动名词?

也就是说,我想定义k它以产生一个常量动词的动名词,如下所示:

   gk =: k 100 200     NB. (or '100 200 k' if it needs to be an adverb.)
   gk@.(0)''
100
   gk@.(1)''
200
Run Code Online (Sandbox Code Playgroud)

Dan*_*ron 5

我同意@eelvex这闻起来像是一个XY问题.使用您的示例,您能否为我们提供一个用例,说明您更喜欢写作的原因

  gk =: k 100 200 300

  gk@.0'' 
100
  gk@.1''
200
Run Code Online (Sandbox Code Playgroud)

代替

  GK =: 100 200 300
  0 { GK
100
  1 { GK
200
Run Code Online (Sandbox Code Playgroud)

甚至

  100*1+  0
100
  100*1+  1
200
Run Code Online (Sandbox Code Playgroud)

等等?

通常,使用连接(@.)而不是动词({)会限制您的运行时灵活性并增加代码复杂性,因此通常您更喜欢后者,如果您能够获得它.

只有当你想要产生非名词结果(即动词或其他连词或副词)或者你需要更高的约束力时,才真正需要连词,但在你的情况下,因为你将名词作为输入而只是生成它作为输出的元素,我没有看到需要结合,或者支付复杂税的理由.取名词(数组)并产生名词结果是动词的存在理由和J代码中最常见的结构.

尽管如此,写起来并不难k.

   k=:[^:(__-:])L:_ 0" _1 0&({. __"_`'')
Run Code Online (Sandbox Code Playgroud)

在这里,我们将样本gerund(常量动词的名词形式)作为模板,然后将空白(the __)替换为我们希望我们的常量函数生成的值.基本上,我们__"_为数组的每个项目制作一个副本,并将__替换为该项目.所以100 200 300变成(100"_)`(200"_)`(300"_):

   gk=:k 100 200 300
   gk@.0 ''
100
   gk@.1 ''
200
Run Code Online (Sandbox Code Playgroud)

但同样,我不推荐这种方法,除非你所面临的问题不能通过一个简单的动词解决,例如{&100 200 300或者(100 * 1 + ]),或者使用动名词方法的收益大于抵消灵活性,复杂性方面的成本,清晰度.

如果您更详细地描述您的具体问题,我们可以帮助您权衡这些选择.