有人会推荐学习J / K / APL吗?
几个月前,我遇到了J / K / APL,在解决一些项目问题的同时也很感兴趣。 对于我制作的每一个优雅的20行python解决scheme,都会有一个十分之一的时间在运行的20个字符的 J解决scheme。 我一直热衷于学习一些基本的J,并且在提取词汇方面做了一些尝试,但是发现学习曲线非常陡峭。
对于那些熟悉这些语言的人,你会build议投入一些时间来学习(特别是我在考虑J)吗? 为了满足我的好奇心,我会这样做,而不是为了职业发展或者其他的事情。
有些个人情况要考虑,如果你在乎:
- 我喜欢math,每天在工作中使用它(作为初创公司的math家),但说实话,我并不觉得受限于我使用的工具(比如python + NumPy),所以我不能用这个借口。
- 我不希望在金融行业工作,这似乎是K用户的主要呼叫端口。 另外我真的应该把C#作为下一个语言学习,因为它是我工作的主要语言。 所以实际上,J几乎肯定不应该成为我学习的下一个语言。
- 我对MATLAB非常熟悉,所以使用基于数组的编程语言不会构成巨大的范式转换。
任何来自那些熟悉这些语言的build议将不胜感激。
几千年前,我是一名APL程序员。 成千上万,我的意思是早在七十年代,当时的习惯字符集意味着我们有了APL键盘和字符集的特殊打印terminal,以及具有特殊字符的IBM电子打字机等等。
我去肯·艾弗森(Ken Iverson)讲了一个关于“为什么APL很酷”的讲座。
他的论文是这样的。 曾几何时,长期分工是一个严重的math课题,留给研究生。 象重复十进制扩展这样的符号涉及到大量的math符号。 曾几何时,甚至像“负面”号码这样的东西都需要精心制作的符号。
多年来 – 当我们更好地理解这些抽象概念时,我们为复杂的概念提出了更为简洁的符号。
APL(和J和K)的要点是将大的algorithm总结为整齐的符号。
如今,我是一名Python程序员。 我发现我早期接触APL时强迫我问“这是什么意思? 和“这是一个可重用的操作?” 和“对于所有这些algorithm的松散结论是什么?
而且,当我追求欧拉项目的时候 ,我的“金光闪闪的APL回忆”支持的Python的“函数编程精简版”对于解决这些练习都非常有帮助。
在过去的25年中,我曾在J和APL工作过,并且可以彻底推荐这两种方法。 当我有任何forms的特别数据分析时,我仍然会回到这个或那个,我也在Project Euler中使用它。
如果你对欧拉项目感兴趣,那么J肯定是你的select。 它支持无限精度整数和素数使它非常合适。
J是我的主要编程语言欧拉项目和个人在工作中使用。 我从来没有遇到过用于数组处理的更好的语言,一旦你掌握了它,这个默认的编程模式既有用又有启发性。 (事实上这很有用,因为这很有启发性。)达到入门级的语言能力是很困难的,阅读别人的代码是一个智力上有纪律的活动,但是由于语言的力量,灵活性和简洁性,毅力有很大的回报。
也就是说,我在工作中保留个人用途的原因是(1)没有人在工作中使用它,(2)学习曲线足够陡峭,使我不能要求我的同事拿起它,(3)你可以在一行代码中构build复杂的程序,这使得阅读一行代码非常具有挑战性,特别是如果你没有自己写代码的话。 (我希望花费至less半个小时的时间研究一个使用十个或更多的操作符的代码行,除非这样做是为了彻底理解底层原则。
有趣的Jfunction的一些例子:
1)任何定义为在一个数字上运行的函数都可以在任意级别的数组上运行。 例如:
totient=: * -.@%@~.&.q: NB. Finding the totient of 10 totient 10 NB. Finding the totient of all numbers from 1 to 10 totient"0 (1+i.10)
这是完全相同的function,只是对1xNinput数组的primefaces(单元素组件)进行操作。 类似的,你可以使用一个定义在二级数组(matrix)上的函数,并通过使用“(等级)连接”将它应用于任何更高级别的数组。
2)你可以在J中使用任何理论上的可逆函数,并通过“反向迭代”来反转它。 例如,
NB. Converts an array of binary digits to a decimal number (#.) 1 0 1 5 NB. Converts a decimal number to an array of binary digits (#.^:_1) 5 1 0 1
自1980年以来,我一直与APL共同生活。我期待在未来的几年继续这样做。 使用APL不仅非常有趣,该语言提供了出色的debuggingfunction。 现代实现是完全成熟的函数式语言,也是面向对象的。
多年来我遇到了很多人,问我想我能继续APL多久。 那些家伙是dbase和PL / 1和ALGOL,Pascal和Forth以及C和Focus等程序员。 得到它了?!
J有点像一个精灵:它需要被保存在一个瓶子里面。 在J中维护大量的批处理软件是一件非常痛苦的事情。 在J中维护接口(基于Windows或Web的,因为是的,你可以设置J来回答Apache来产生Web输出)是一个实验性的,鲜为人知的地狱圈。
另一方面,如果你想要parsing,筛选,分析,紧缩等一些数据来摆弄它,找出一个algorithm的优点,或者用最短的方法打印互联网来计算在一个圆圈中有多less个三angular形,或者不是。
我来添加J作为careers.stackoverflow.com我的职业生涯中的交易断路器非常接近,但我最终离开了它。 对我来说,使用J是好的,但是产生J却不是。
编辑:
那是前一阵子 我仍然觉得在生产(即所有的MVC)中完整的J解决scheme效果不佳。 从最初的回应中,我将J用作一个C#项目中的COM,其中J提供了一个庞大的matrix,这个matrix在C#中很难pipe理,非常满意。
我们的部分工作是使数据模型和代码发言 。 把质量和J非常简洁的语法联系起来并不容易。 与J不同,有几个框架可以很容易地与IDE一起工作,并且有足够的支持来允许人们以可读的方式安排代码。 J的超matrixfunction并不能弥补它缺less的东西。
我认为你的3点表明你不需要学习J.但是,我不能想到学习一门新语言是有害的。
花些时间学习一些你感兴趣的东西(或者任何新的语言)总会提高你的其他编程技能。 你学习了不同的方法来解决问题,你可以用不同的语言来实现。
另外,使用J语言的最小语法,当您使用另一种语言实现解决scheme时,确保获得正确的结果将是一种很好的语言。
回到过去,我是一名APL语言开发人员,编码为370汇编。 我把J移植到了OS2上,但从来没有学过如何将它用于实际工作。 我目前正在使用Java和PHP,并正在评估Python。 在Python教程的前三部分之后,我对APL的许多相似之处感到震惊,这就把我带到了这里。
我强烈build议学习APL或J作为一种智力练习。 它会改变你对编程的思考方式(扭曲你的大脑),并可能帮助你的Python编码。 另外APL和J程序员也有一些工作,可能比工作更less的程序员。
在过去的几年中,我曾经在1970年代担任APL程序员。 我喜欢这种语言,但多年没有用过它。
对于某些事情来说这是一个很好的语言,但是我真的不能用它来进行Web开发。
什么是统计和matrix操作。 你可以用3个字符来解决一个class轮编程问题。 certificateLP实现的正确性要比以C为例的页面要容易得多。
所以如果你想学习的快乐学习,我说去吧。 为了提高你的就业前景,还有很多其他的东西可以学习,这将会给潜在的雇主留下更多的印象。
对我这个五十多岁的人来说,这是一个有趣的确认。
今天早些时候,我决定在27年的零时间编程之后,学习一门新的21世纪编程语言。 我select了Python,相当随意,害怕现在我们都生活在基于GUI和面向对象的世界。
很令我高兴的是,80年代初,我作为一个APL家伙谋生的一年,意味着我在字面上翻阅材料,立即就能理解:)只是想分享一下。
是的,学习APL / J / K,它会给你一个独特的一瞥,什么是可能的。
我指出,@ MPelletier的“多less个三angular形适合一个圆圈”,它的含义是“……但不是现实世界的问题”,是有点短视的。 是的,J Software的IDE缺乏一些东西,但是构build一个自己的IDE不是一个大问题,一个好的IDE可以掩盖一个糟糕的语言(20行到20个字符的缩减不会被打喷嚏)。我一直在做APL只要@KaiJaeger有,如果不是更长,我的思想可能会被扭曲,但我从来没有快乐的编程与其他任何事情。