2010-05-02 75 views
11

我已经使用J了几个月了,我发现阅读不熟悉的代码(例如,我没有写自己)是该语言最具挑战性的方面之一,特别是当它默默无闻。过了一会儿,我想出了这个策略:阅读J代码的最佳策略

1)代码段复制到word文档

2)取从(1)每个操作员,并将其放置在单独的行,以便读取垂直

3)更换各运营商,在词汇页面

4)不要自J语法粗略翻译成英语语法

5)它的文字描述使用翻译,以确定概念相关的组件和与换行

6)收件的什么从(5)假定每个组件做一个描述它们分开,用简单的英语散文

7)收件的什么整个程序是应该做的说明,基于(6)

8)写一个解释为什么从(1)的代码可以说代表从(7)的设计概念。

尽管我从这个过程中学到了很多东西,但我觉得它很费时费力 - 尤其是如果有人使用我以前从未遇到过的概念设计他们的程序。所以我想知道:J社区中的其他人有最喜欢的方式来找出隐藏的代码?如果是这样,这些方法的优点和缺点是什么?

编辑:

排序的代码,我需要打破的一个例子是:

binconv =: +/@ ((|[email protected](2^[email protected]#@])) * ]) @ ((3&#.)^:_1) 

我写了这一个我自己,所以我碰巧知道,它需要一个数值输入,将其重新解释为三元数组,并将结果解释为基数为2的数字的表示,并且至多有一次重复。 (例如,binconv 5 =(3^1)+ 2 *(3^0) - > 1 2 - >(2^1)+ 2 *(2^0)= 4。)但是如果我没有偶然发现它任何以前的历史或文档,搞清楚这是它的一个非平凡的练习。

回答

9

试着先把动词分解成它的组件,然后看看它们做了什么。而不是总是参考词汇表,你可以简单地尝试一个数据组件,看看它做了什么,看看你是否可以搞清楚。要查看动词的结构,有助于了解您正在查看的语音部分,以及如何识别基本结构(如叉子)(当然,在较大的默认结构中,用圆括号分隔)。只需在ijx窗口中输入动词并按下回车键即可分解结构,并可能有所帮助。

考虑以下简单的例子:<[email protected]:@#{/:~

我知道<.-:#{/:都是动词,~是副词,以及@是连词(见演讲环节中的词汇部分)。因此,我可以看到,这是一个带有左动词<[email protected]:@#,右动词/:~和二元{的叉结构。这需要一些练习来看看,但有一个更简单的方法,让J示出你的结构通过键入到IJX窗口,并按下Enter键:

<[email protected]:@#{/:~ 
+---------------+-+------+ 
|+---------+-+-+|{|+--+-+| 
||+--+-+--+|@|#|| ||/:|~|| 
|||<.|@|-:|| | || |+--+-+| 
||+--+-+--+| | || |  | 
|+---------+-+-+| |  | 
+---------------+-+------+ 

在这里你可以看到动词结构(或,你会习惯于看这些)。然后,如果你不能识别这些作品,请与他们一起玩,看看他们做了什么。

10?20 
15 10 18 7 17 12 19 16 4 2 
    /:~ 10?20 
1 4 6 7 8 10 11 15 17 19 
    <[email protected]:@# 10?20 
5 

你可以进一步分解它们,并根据需要进行实验来找出它们(这个小例子是一个中位动词)。

J将很多代码打包成几个字符,大型默认动词看起来非常吓人,即使对有经验的用户也是如此。试验将比你的记录方法更快,你可以通过试图分解大型复杂动词来真正学到很多关于J的知识。我想我会建议重点努力去看看语法结构,然后找出这些部分,逐步建立起来(因为这就是你最终会写隐性动词的原因)。

+0

有趣。我以前从来没有明确地将事情按照词类分解 - 通常我的思维停留在结构与物质操作者的层面上,至少在我解释J练习中的默示动词时,或者试图罗杰辉在撰写他的欧拉项目解决方案时想到了什么。 – estanford 2010-05-05 22:43:42

3

(我回答部分把这个不是编辑的问题,因为这个问题看起来足够长的时间,因为它是的。)

我只是找到了一个优秀的论文上the jsoftware website与乔丹的回答运作良好结合以及我在问题中描述的方法。作者提出了一些相关的意见:

1)副词所修饰的动词是动词。

2)超过三个连续动词的连续动词是一系列动词,它可能在最左侧有一个动词或一个动词,取决于动词的动词数量。

这加快了将默认表达式翻译成英文的过程,因为它允许您将动词和副词组合成概念单元,然后使用嵌套叉结构快速确定操作符的实例是单点还是双点。这里有一个翻译我没有使用精制方法的一个例子:

d28=: [:+/\{[email protected]],>:@[#(}.-}:)@]%>:@[ 

[: +/\ 

{[email protected]] , 

>:@[ # 

(}.-}:)@] % 

>:@[ 
  • 帽(加缀前缀)

    (头顶上右边的参数)拉威尔

    (增量顶上左参数)相符

    (杀头减去削减)顶上右 参数

    除以

    增量顶上左参数

  • 通过

    右参数, 与

    (1加上弄清一起的第一项所定义的序列 的部分和左参数)拷贝 的

    (除第一个元素外都是)减去 (所有,但最后一个元素)

    正确的说法

    ,通过

    (一加左参数)分开。

  • 通过

    开始以相同的初始点定义的序列 的部分和,

    和由

    附加的从右边的参数导出 点连续副本减去来自每个前身其 后继

    并将结果除以数字副本210进行

  • 之间的插值X-许多整数y
1

个人的项目,我觉得j的代码是做什么的条款 - 如果我没有任何例子参数,我很快就迷路了。如果我确实有例子,通常我很容易看到子表达式在做什么。

而且,当它变得困难时,这意味着我需要在字典中查找单词,或者可能研究它的语法。

通过阅读这里的处方,我认识到这与其他人使用该语言的方式不同。

也许我们应该称之为“测试驱动理解”?

1

我只想谈谈我如何阅读: <。@ - :@#{/:〜

首先,我知道,如果它是一个功能,在命令行中,它必须要输入(用于测试)为

(< @ - : @#{/:〜)

现在我看看括号中的内容。我看到一个/:〜,它返回它的参数的排序列表{{选择列表中的一个项目,#返回列表中项目的数量, - :一半,以及<。,floor ...和I开始认为这可能是中位数, - 列表中的项目数减半,但#是如何得到它的论点的?我看着@标志 - 意识到那里有三个动词 - 所以这是一个分叉。该列表进入右侧并进行排序,然后在左侧,fork将列表获取到#以获取参数的数量,然后我们知道它占据了一半的底线。所以现在我们有执行顺序:

排序,并将输出传递给中间动词作为正确的参数。

将列表中元素数量的一半作为底层,并成为中间动词的左边参数。

做中间动词。

这是我的方法。我同意有时这些短语有太多奇怪的东西,你需要查看它们,但我总是在J即时命令行中找出这些东西。

10

只想添加到Jordan's Answer:如果您没有框显示开启,你可以用5!:2

f =. <[email protected]:@#{/:~ 
    5!:2 < 'f' 
┌───────────────┬─┬──────┐ 
│┌─────────┬─┬─┐│{│┌──┬─┐│ 
││┌──┬─┬──┐│@│#││ ││/:│~││ 
│││<.│@│-:││ │ ││ │└──┴─┘│ 
││└──┴─┴──┘│ │ ││ │  │ 
│└─────────┴─┴─┘│ │  │ 
└───────────────┴─┴──────┘ 

还有一个树形显示明确的格式化的东西是这样的:

5!:4 <'f' 
       ┌─ <. 
     ┌─ @ ─┴─ -: 
    ┌─ @ ─┴─ #  
──┼─ {    
    └─ ~ ─── /:  

请参阅5!: Representation的词汇表页面以及更改默认值的9!: Global Parameters

另外,对于它的价值,我自己的阅读J的方法是用手重新输入表达式,从右到左构建它,并随时查找片段,并使用身份函数形成临时当我需要时训练。

因此,例如:

/:~ i.5 
0 1 2 3 4 
    NB. That didn't tell me anything 
    /:~ 'hello' 
ehllo 
    NB. Okay, so it sorts. Let's try it as a train: 
    [ { /:~ 'hello' 
┌─────┐ 
│ehllo│ 
└─────┘ 
    NB. Whoops. I meant a train: 
    ([ { /:~) 'hello' 
|domain error 
|  ([{/:~)'hello' 
    NB. Not helpful, but the dictionary says 
    NB. "{" ("From") wants a number on the left. 
    (0: { /:~) 'hello' 
e 
    (1: { /:~) 'hello' 
h 
    NB. Okay, it's selecting an item from the sorted list. 
    NB. So f is taking the (<. @ -: @ #)th item, whatever that means... 
    <. -: # 'hello' 
2 
    NB. ??!?....No idea. Let's look up the words in the dictionary. 
    NB. Okay, so it's the floor (<.) of half (-:) the length (#) 
    NB. So the whole phrase selects an item halfway through the list. 
    NB. Let's test to make sure. 
    f 'radar' NB. should return 'd' 
d 
    NB. Yay! 

编:

NB. just to be clear: 
    f 'drara' NB. should also return 'd' because it sorts first 
d