阅读J代码的最佳策略

est*_*ord 11 j tacit-programming

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

1)将代码段复制到word文档中

2)从(1)中取出每个操作员并将其放在单独的一行上,使其垂直读取

3)用词汇表页面中的口头描述替换每个操作符

4)从J语法到英语语法的粗略翻译

5)使用翻译来识别与概念相关的组件,并使用换行符分隔它们

6)用普通的英文散文写出(5)中每个组成部分应该做的描述

7)基于(6)写出整个程序应该做什么的描述

8)写出为什么可以说(1)中的代码代表(7)中的设计概念的解释.

虽然我从这个过程中学到了很多东西,但我发现它相当艰巨和耗时 - 特别是如果有人使用我以前从未遇到的概念设计他们的程序.所以我想知道:J社区中的其他人是否有最喜欢的方法来找出晦涩难懂的代码?如果是这样,这些方法的优点和缺点是什么?

编辑:

我需要分解的代码类型的示例如下:

binconv =: +/@ ((|.@(2^i.@#@])) * ]) @ ((3&#.)^:_1)
Run Code Online (Sandbox Code Playgroud)

我自己写了这个,所以我碰巧知道它需要一个数字输入,将它重新解释为一个三元数组,并将结果解释为base-2中一个数字的表示,最多只有一个重复.(例如,binconv 5 =(3 ^ 1)+ 2*(3 ^ 0) - > 1 2 - >(2 ^ 1)+ 2*(2 ^ 0)= 4.)但如果我偶然发现它没有任何先前的历史或文件,弄清楚这是它的作用将是一个非常重要的练习.

tan*_*orm 10

只是想添加到Jordan的答案:如果你没有开启盒子显示,你可以用这种方式明确地格式化5!:2

   f =. <.@-:@#{/:~
   5!:2 < 'f'
??????????????????????????
?????????????????{????????
????????????@?#?? ??/:?~??
???<.?@?-:?? ? ?? ????????
???????????? ? ?? ?      ?
????????????????? ?      ?
??????????????????????????
Run Code Online (Sandbox Code Playgroud)

还有一个树形显示:

   5!:4 <'f'
              ?? <.
        ?? @ ??? -:
  ?? @ ??? #       
???? {             
  ?? ~ ??? /:     
Run Code Online (Sandbox Code Playgroud)

请参阅5!!表示的词汇表页面以及9!:全局参数以更改默认值.

另外,对于它的价值,我自己阅读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!
Run Code Online (Sandbox Code Playgroud)

附录:

   NB. just to be clear:
   f 'drara' NB. should also return 'd' because it sorts first
d
Run Code Online (Sandbox Code Playgroud)


小智 9

尝试先将动词分解为其组件,然后查看它们的作用.而不是总是提到词汇,你可以简单地尝试一个数据组件,看看它做了什么,看看你是否可以搞清楚.要查看动词的结构,有助于了解您正在查看的词性,以及如何识别叉子等基本结构(当然,在较大的默认结构中,用括号分开).只需在ijx窗口中输入动词并按Enter即可细分结构,并可能有所帮助.

考虑以下简单示例: <.@-:@#{/:~

我知道,<. -: # {并且/:都是动词,~是一个副词,且@是连词(见链接的讲话在词汇部分).因此,我可以看到这是一个左侧动词<.@-:@#,右侧动词/:~和二元组的分叉结构{.这需要一些练习才能看到,但是有一种更简单的方法,让J通过在ijx窗口中输入并按下回车来显示结构:

   <.@-:@#{/:~
+---------------+-+------+
|+---------+-+-+|{|+--+-+|
||+--+-+--+|@|#|| ||/:|~||
|||<.|@|-:|| | || |+--+-+|
||+--+-+--+| | || |      |
|+---------+-+-+| |      |
+---------------+-+------+
Run Code Online (Sandbox Code Playgroud)

在这里你可以看到动词的结构(或者,你可以在习惯了这些之后).然后,如果你无法识别这些碎片,可以和它们一起玩,看看它们的作用.

   10?20
15 10 18 7 17 12 19 16 4 2
   /:~ 10?20
1 4 6 7 8 10 11 15 17 19
   <.@-:@# 10?20
5
Run Code Online (Sandbox Code Playgroud)

您可以进一步细分它们并根据需要进行实验以找出它们(这个小例子是一个中值动词).

J将很多代码打包成几个字符,大的默认动词看起来非常令人生畏,即使对于有经验的用户也是如此.尝试将比你的记录方法更快,你可以通过尝试分解大型复杂动词来学到很多关于J的知识.我想我会建议专注于尝试查看语法结构,然后弄清楚各个部分,逐步建立起来(因为这就是你最终会如何编写默认动词).