学习J语言

学习J语言

J语言 (www.jsoftware.com) 和Javascript, Java没有一点关系。J衍生于APL。APL始于上世纪七十年代,IBM大型机的时代。Kenneth Iverson因为APL的工作,得了1979年的图灵奖。后来他和Roger Hui又一起开发了J语言。Roger Hui至今还一直活跃在J语言的论坛上,为用户答疑。

J语言的最大特点就是代码简洁。 如果要给J起个中文名字,就叫“简语言”吧。

J的最大优点:面向数组。例如一组数,加个一

	2.5 3.1 11 2 + 1
 3.5 4.1 12 3

不需要写循环,直接加。这种功能MATLAB或者Mathematica之类的数学软件才有。(J是免费的)

J最大的问题也是代码太简洁,可读性很差。不适合多人合作的大型软件项目。就算自己写的代码,三个月后,自己读不懂。

所以,网上时常有人纠结的问:该不该学习J语言?

其实如果把J看成一个超级科学计算器,就没有那么多困惑了。

一款好的计算器需要:按键次数少,函数/算符功能多而强,一下子得到计算结果。J完全符合这些标准。

求平均值

例如,求一组数的平均值:

  	(+/ % #) 2.5 3.1 11 2
  4.65

其中J的每个算符代表一个功能+/ 是数列求和,% 是除法,#是数列长度。组合起来,完成计算,一个字:简。

求中间值

同样一组数,求其中间值。

	(2%~#{2#/:~+\:~) 2.5 3.1 11 2
2.8

看不懂没关系,我来慢慢解析。

	/:~ 2.5 3.1 11 2  N.B. ascending sort
2 2.5 3.1 11	
	(2 # /:~) 2.5 3.1 11 2 N.B. double up
2 2 2.5 2.5 3.1 3.1 11 11	

把数列升序排,然后1变2,它们的中间值还是一样的。第二个数列的长度总是偶数,所以省去了奇偶不同处理的if语句。

	((<:@#,#) { 2 # /:~) 2.5 3.1 11 2 N.B. take the middle ones
2.5 3.1	

然后根据数列的长度(总是偶数),取出中间的两个。最后取平均,求得中间值:

	((+/ % #) @: ((<:@# ,#) { 2 # /:~) ) 2.5 3.1 11 2 N.B. done
2.8

一开始看到的比这更简的代码

	(2%~#{2#/:~+\:~)

先把数列的升序和降序加起来,然后取中间,最后除以2。“取中间”只要取一个数,代码又简了。

读懂J代码

如果你觉得J代码有趣,把算法思想浓缩起来。J有很丰富的在线文档,和应用资料,简直是一座金矿,供你挖掘。

一开始看J代码,有点像读中国的古诗文。需要老师帮助断句,释义。一旦读懂了,才慢慢品味出其中的精妙。

所以代码是写短了,但读代码花的时间变长了。不省功夫。

不过对于把代码当成诗歌读的我们,费劲才有乐趣。


版权声明:本文为weixin_43801661原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。