数组语言环境虽然令人着迷,却令人困惑.是否有理由选择J或K或APL或A中的一个?这些选项似乎都不是开源的 - 是否有开源版本?我很想扩大我的想法,但我仍然感到困惑.
几个月前我遇到了J/K/APL,同时解决了一些项目的问题,并且至少可以说是好奇.对于我制作的每一个看起来优雅的20行蟒蛇解决方案,都会有十分之一的gobsmacking 20 字符 J解决方案.我一直热衷于学习一些基本的J,并且已经做了一些尝试来学习词汇,但是发现学习曲线非常陡峭.
对于那些熟悉这些语言的人,你会建议花一些时间学习一门(我特别想到J)吗?为了满足我的好奇心而不是为了职业发展或某些这样的事情,我会这么做.
如果您愿意,可以考虑一些个人情况:
熟悉这些语言的人的任何建议都将非常感激.
通过动词,副词,叉子等编写J风格的超级浓缩默契编程,是否曾经通过图书馆尝试主流功能语言?
如果是这样,结果有多成功?
如果没有,是否有技术问题使这不可能,或者它是否值得做?
我特别感兴趣的是像forks这样的结构似乎与函数式编程中的基本概念没有直接对应.
泄露
这是一个"普遍"的问题,也许没有具体的答案,但它并不打算作为一场火焰战争.在开始我的项目之前,我真的想要一些信息.
我必须实现一个特别的项目,它将真正受益于J提供的数据结构和抽象.这是一个大型项目,旨在作为大型(软实时)Web应用程序的核心组件.所以表现非常重要.
我一直试图在大型商业或开源项目中找到有关J的使用的一些信息,但我无法找到任何有关我的决定继续前进的信息.我有:
我在为项目使用J时会犯一个错误吗?它似乎拥有我想要的一切 - 特别是在数据结构,抽象和简洁方面.当然,我可以花时间在F#,C#或C++中模拟所有这些属性,但J已经拥有它们,所以...
有人可以告诉我在重要项目中使用J(或任何晦涩的语言)的一些缺点吗?它的表现不够好吗?它没有图书馆吗?还有什么我应该知道的吗?
在此先感谢您的回复.
我目前正在学习迷人的J编程语言,但有一点我无法弄清楚如何过滤列表.
假设我有任意列表3 2 2 7 7 2 9,我想删除2s,但保持其他一切不变,即我的结果将是3 7 7 9.我怎么做到这一点?
我刚刚开始学习J,这非常有趣,但我想知道它是什么样的语言,与常见的范例和分类有关.例如,您可以说F#是强类型的,主要是功能性的(它支持OO和过程编程,但它被认为是"功能")语言属于ML族.然而,对于J,我找不到很多关于如何"按常规"对其进行分类,或者在Stackoverflow上找到任何确认它是函数式编程语言的东西.维基百科称它"是一种非常简洁的数组编程语言","支持函数级编程","不是冯·诺依曼编程语言",其中没有一种更有用.
我有一些问题:
J/K/APL属于哪种主要范式(程序性,OO,功能性,逻辑性)?如果他们的范例只是"阵列编程",那么这种范式是什么样的,或者最相似的呢?
什么知名的编程语言是J/K/APL最相似的?例如,我猜他们就像Lisp,因为它们在数组(列表)上运行,并且具有最小的,没有逗号语法.
我只是想根据我已经知道的东西将这些语言分类.谢谢.
language-agnostic paradigms haskell functional-programming j
(对不起,我很愚蠢,没有受过教育,所以这可能是一个荒谬的问题.)
我刚开始看J,他们使用术语"monadic"和"dyadic"来表示(对我来说)是一元和二元运算符.为什么要这样做,它与我听到的那个地方(Haskell)有什么关系呢?我的猜测是他们是无关的同音异义词,但我不确定.
我的主要编程语言j最近是开源的.为了改进它,我正在研究用C语言编写的源代码.
但是,自从我读过或写过C以来,这已经是一段很长的时间了,而我当时并不擅长.编写这个特定代码库的方式是......特殊的(许多APL解释器,其中的J,其源代码以高级"APL样式"编写,即使用低级语言编写;非常简洁,冗余避免,重大的宏观用途等)
目前,我正在尝试理解它采用的基本数据结构.最基本的是typedefA("A"代表" 数组 "):
typedef struct {I k,flag,m,t,c,n,r,s[1];}* A;
Run Code Online (Sandbox Code Playgroud)
我明白很好.但我正在努力绕过AF两行之后:
typedef A (*AF)();
Run Code Online (Sandbox Code Playgroud)
这个语法是什么意思?特别是,当事情后来被宣布为"AF型"时,它意味着什么?一个是AF简单的指针A?
我的直接目标是解释包含类型V(对于" 动词 ")的内存转储,其前两个成员是AFs:
typedef struct {AF f1,f2;A f,g,h;I flag,mr,lr,rr,fdep;C id;} V;
Run Code Online (Sandbox Code Playgroud)
但是我的总体目标比这更大,所以请详细说明AF定义中使用的语法.
我已经使用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.)但如果我偶然发现它没有任何先前的历史或文件,弄清楚这是它的作用将是一个非常重要的练习.
假设我有两个列表,一个是文本t,一个是字符列表c.我想计算每个字符出现在文本中的次数.
使用以下APL代码可以轻松完成此操作.
+?t?.=c
Run Code Online (Sandbox Code Playgroud)
但它很慢.它取外部产品,然后对每列进行求和.
这是一个O(nm)的算法,其中n和m是大小t和c.
当然我可以在APL中编写一个t逐字符读取的程序程序,并在O(n + m)中解决这个问题(假设完美哈希).
有没有办法在没有循环(或条件)的APL中更快地完成这项工作?我也接受J的解决方案.
编辑: 实际上,我这样做的地方是文本比字符列表短得多(字符是非ascii).我正在考虑文本的长度为20,字符列表的长度为数千.
如果n小于m,则有一个简单的优化.
w ? (?t)?c
f ? +?t?.=w
r ? (?c)?0
r[c?w] ? f
r
Run Code Online (Sandbox Code Playgroud)
w只包含t中的字符,因此表大小仅取决于t而不取决于c.该算法在O(n ^ 2 + m log m)下运行.其中m log m是进行交叉运算的时间.
但是,如果有人提供了大量的文本文件,则仍然优选使用次二次算法.