我来自 C、Fortran、Python、R、Matlab 和一些 Lisp 的背景——我读过一些关于 Haskell 的东西。有哪些用 J 或 APL 家族的其他语言编写的巧妙想法/示例,这些想法/示例是独一无二的,并且没有在更常见的语言中实现?我总是有兴趣找出我错过了什么......
3 回答
J 有大量的操作符,可以很容易地编写复杂的程序,而无需寻找库。它具有极其强大的数组处理能力,以及使显式控制结构与大多数用途无关的迭代构造——以至于我更喜欢使用张量代数来声明显式循环,因为它更方便。J 在解释器中运行,但一个好的 J 脚本可以和用编译器语言编写的程序一样快。(当您取出显式循环时,解释器不必在每次执行时都编译循环的内容。)
J 的另一个有趣的特性是隐性编程。您可以在不显式引用输入变量的情况下构建脚本,这样您就可以纯粹根据您打算做什么来表达一个想法。例如,我可以将平均函数定义为“将列表中的术语相加并将它们除以列表中的条目数”,如下所示:
(+/ % #)
或者我可以制作一个脚本,将其分割成一个二维数组,并且只返回平均值大于 10 的行的平均值:
(10&<#])(+/%#)"1
你可以用 J 做很多其他的事情。它是一种可执行形式的数学符号。想法很容易概括,因此您可以从学习该语言如何工作的任何一个方面中受益匪浅。
我认为 J 最有趣的方面之一是它是为数不多的非冯诺依曼语言之一,它甚至是遥不可及的主流语言。
嗯。J主流?嗯,是的,与其他非冯诺依曼语言相比,它是!一开始只有很少的非冯诺依曼语言,其中大多数只存在于一些博士论文中,从未真正实现过,即使这样,那些已经实现的语言通常也有 1 个用户群。通常,如果至少有一个用户与发明它的人不在同一楼层,则它们被认为是成功的。
相比之下, J是主流。特别是,J 是基于 John Backus 的 FP 来自他的开创性图灵奖讲座“编程可以从冯诺依曼风格中解放出来吗? ”它是 AFAIK 唯一有效的实现。(例如,我认为 Backus 从未真正实现过 FP。)
This is perhaps not as unique as I make it out to be, but the top feature I can think of for J is implicit typing. It creates that nice abstraction level above execution and memory management to focus on the data being processed.
Suppose you need to store a number:
var1 =: 10
And it's done. Array?
var2 =: 4 8 15 16 23 42
Done. Oh, but wait, you need to divide that by 3.7? Don't bother with casting, just go for it:
var2 % 3.7
Being rid of that necessity to cast and manipulate and allocate is a tiny blessing.