将副词应用于动名词列表

时间:2017-07-09 20:21:00

标签: j

考虑一系列动名词以及我们希望将其应用到的一些数据,周期性地:

ms=.*`+`-     NB. list of gerunds
d =.3 4 5 6   NB. some data

我们可以这样做:

ms/ d    NB. returns 9, ie, the result of 3 * 4 + 5 - 6

现在我们提出一个问题:如果我们改变应用动词的顺序,结果会如何变化?也就是说,我们考虑所有6种可能的订单:

allms=. (A.~i.@!@#) ms

看起来像:

┌─┬─┬─┐
│*│+│-│
├─┼─┼─┤
│*│-│+│
├─┼─┼─┤
│+│*│-│
├─┼─┼─┤
│+│-│*│
├─┼─┼─┤
│-│*│+│
├─┼─┼─┤
│-│+│*│
└─┴─┴─┘

要回答这个问题,我们可以这样做:

allms (4 : 'x/ y')"1 d

NB. returns 9 _21 _1 _23 _41 _31

但请注意,我被迫使用匿名的非默认动词来完成此任务。因为为了应用副词/,我必须有一个名为动词的 。当我真正想做的是将/视为等级1动词和" map"它在我的列表allms上, in spirit 就像非法的表述一样:

/&d"1 allms  NB. This is invalid J

也就是说,对于列表中的每个动名词,请使用副词/对其进行转换,并将其应用于数据d

J似乎抵制了这个高阶"处理动词,如数据"思维。所以我想知道解决这个问题的自然方式是什么。

具体而言,您将获得如上所述的动名词ms和数据d的列表。任务是创建一个动词,该动词返回ms/ d的每个可能排序的结果列表ms(即,在我们的示例中返回9 _21 _1 _23 _41 _31的动词)。动词必须是默认动词

2 个答案:

答案 0 :(得分:2)

你真的不想那样

有一些基本的句法原因,为什么你不能默认切片和切块运算符(副词和连词)。

如果不详细说明,允许运算符由其他运算符修改,例如您使用/修改的"1,则需要对J的语法进行基本重组。并且会有重大的权衡,尤其是简单性和表现力(即符号优雅)¹²。

所以,如果你想在像这样的动名词上分配运算符,你必须为它编写实用程序,到目前为止最直接的方法是使用显式代码。在此域中要考虑的一个预打包实用程序是doog script, available in the J Wiki and SVN repo

无论如何

但是,doog脚本与您的方法一样,基本上是明确的。  所以如果你真的想默默地实现这些目的:

   D       =.   foo`bar`baz 
   t       =.   D / (@:])  NB. Here's our "over" (/)

   over    =.  [^:(D -: ]) L: (L.D) & (5!:1<,'t')
   allOver =:  (]^:[~ 1:`'' , over f.)~


   3 4 5 6 allOver"1~ (A.~i.@!@#) *`+`-       NB. Note the "1
9 _21 _1 _23 _41 _31

我警告过你

没有详细介绍,这里的技巧是使用动词]^:[来允许^:执行任意原子表示作为输入。

也就是说,some_atomic_rep f^:[ data变成f^:some_atomic_rep data,对于合适的原子代表,它可以执行任何事情,同时使用动词可用的所有参数处理优点(特别是等级)

其余的只是一种优雅的(阅读:懒惰)方式,将你的动态输入(用你的等级或其他参数选择机制提供给动词的那个部分)变成适合于右手参数的原子代表^:

它的核心是我们有D / (@:])模板,我们将D替换为您选择的动名词(@:]是必要的,因为在动名词执行时,它将有两个输入:您的实际输入,d,以及它自身,D 4

Lasciate ogne speranza

要访问这些邪恶愚蠢的Ultima Thule,请查看dont in J的发现,就像do".)一样,除了......真的,你不应该'吨。

¹作为一个简单的例子:弄清楚这对于wordclasses之间的优先级意味着什么。

²话虽如此,地下J俱乐部F ^ 4( The Fully Fixable Functional Faction )的领导者Jose“Pepe”Quintana曾经发现了一个实际允许的后门运营商将其他运营商作为投入。在"J Myths Puzzles" thread from 2008中查看此消息(滚动浏览所有扰流板隐藏空白行)。当然,一旦他提到,罗杰就会注意到,并立即填补了这个空白。

³ I once put it的方式是“是的,dcog是丑陋的,但我喜欢把它想象成弥赛亚密码:它很难看,所以其他代码也不必如此。 ”

4 请注意,模板gerund foo`bar`baz可以是您喜欢的任何长度,使用任何名称。没关系。重要的是你使用的名字要么是谚语,要么是未定义的(解释者在设计时就像谚语一样对待)。使用代词或亲运算符会破坏东西。或者,你可以使用另一种名词,比如简单__或其他东西(我发现的助记符填写____ )。

答案 1 :(得分:1)

ms=.*`+`-     NB. list of gerunds
d =.3 4 5 6   NB. some data
allms=. (A.~i.@!@#) ms

我从&#34;开始处理我的动词,如数据&#34;使用字符串来表示动名词

*`+`-

附加'/'字符,然后使用128!:2(Apply),它将一个描述动词的字符串作为其左参数,并将其应用于作为其右参数的名词。当然要做到这一点,你需要将allms变为动词字符串。

可以使用以下方式完成:

   [ ger=. ,&'/' @ }: @ (1j1 #!.'`' ;)"1 allms
*`+`-/
*`-`+/
+`*`-/
+`-`*/
-`*`+/
-`+`*/

然后使用128!:2(应用)

   ger  128!:2 d
9 _21 _1 _23 _41 _31

作为单行隐性动词

   gvt=. ,&'/'@ }:@(1j1 #!.'`' ;)"1 @: [ 128!: 2 ] 
   allms gvt d
9 _21 _1 _23 _41 _31

我很少玩这些游戏,所以我不是说这是最好的方法,但它确实有用。