考虑一系列动名词以及我们希望将其应用到的一些数据,周期性地:
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
。
具体而言,您将获得如上所述的动名词ms
和数据d
的列表。任务是创建一个动词,该动词返回ms/ d
的每个可能排序的结果列表ms
(即,在我们的示例中返回9 _21 _1 _23 _41 _31
的动词)。动词必须是默认动词。
答案 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 。
要访问这些邪恶愚蠢的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
我很少玩这些游戏,所以我不是说这是最好的方法,但它确实有用。