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的知识.我想我会建议专注于尝试查看语法结构,然后弄清楚各个部分,逐步建立起来(因为这就是你最终会如何编写默认动词).