跳转到内容

软件工程师手册/语言词典/J

来自维基教科书,开放的书籍,面向开放的世界

J 不是 Java。它是 APL 的 ASCII 后代。这里是 维基百科条目。

截至撰写本文时,该软件是免费的,可在 J 软件页面 上获取。

J 是一种面向数组的功能性语言。

执行入口点

[编辑 | 编辑源代码]

入口点的概念在 J 中并不适用。程序本身就是入口点。

通用语法

[编辑 | 编辑源代码]

J 语句

J 语句以换行符结束。例如

a=: b

J 注释以伪标记 NB. 开头,并持续到行末。不提供块注释,但可以在文本文字中使用该角色。例如

noun define
 This is some descriptive text,
 which may go on for a number of lines,
 and which needn't follow J's syntactic rules.
)

请注意,单独一行上的单个右括号会结束多行定义。

变量声明

[编辑 | 编辑源代码]

变量通过指定其定义来声明。文字数字数组可以通过在数字之间放置空格来引入。文字字符数组可以通过在单引号之间放置多个字符来引入

 x=: 1
 plus=: +
 x plus 2 3 5 7

3 4 6 8

 'Hello world!'

Hello World!

方法声明/实现

[编辑 | 编辑源代码]

J 中有两个定义词。

=:

实现具有全局范围的定义。

=.

实现具有局部范围的定义。

但是,请注意,在类和对象的上下文中,全局范围实际上是指类范围或对象范围。J 中“类或对象”的通用术语是“locale”(注意与“local”的细微拼写差异)。大多数方法都作为 J 动词实现,其参数在隐式定义的数组中提供(句点是名称的一部分)。这可以通过使用命名这些变量的字符数组文字作为 = 的左参数来解包成一系列局部变量。

foo=: verb define
'arg1 arg2 arg3'=. 3{.y.
'the last line a method specifies the result'
)

作用域

[编辑 | 编辑源代码]

请参阅 变量声明

条件语句

[编辑 | 编辑源代码]

由于 J 是一种面向数组的语言,因此大多数 J 程序员使用数据选择来实现条件逻辑。虽然这不是大多数语言的传统功能,但 SQL 程序员经常使用类似的技术。

但是,J 也在定义动词的主体中提供更传统的 if. 语句。

  if. 1 = x then. y=: y + 3 end.

这些条件词本身不是语句语法的组成部分,因此可以分布在多行上。

  if.
     2 = y
  then.
     z=: bar 99
     a=: bagle * mayo
  else.
     b=: 1 2 3 4
  end.

循环语句

[编辑 | 编辑源代码]

由于 J 是一种面向数组的语言,因此每个操作都能够在任意维数组上循环。因此,循环可以在任何表达式中隐式发生。

 x + y

将循环所有适当的值,只要 x 和 y 的定义符合要求。

 2 3 4 + 10 100 1000

12 103 1004

此机制可以通过指定操作的等级来配置,双引号字符在此角色中使用(双引号字符在 J 中不表示字符串,通常单用双引号,而不是成对使用)。

但是,在定义动词的主体中,提供了更多传统的控制词,就像条件语句一样

 while. 
    x < 100
 do.
    x=: x+1
    blah, blah, blah
 end.

在大多数情况下,你应该使用 J 的隐式循环。例外情况是不可能一次获取所有数据,例如在处理 IO 时。但是,即使在那里,使用 J 的事件处理而不是显式循环可能也明智。

输出语句

[编辑 | 编辑源代码]

对于许多目的,不需要显式输出语句。J 通常在计算器模式下使用,结果会隐式显示。

但是,也可以使用 1!:2 标记进行文件输出(这可以看作是库 1,入口点 2)。通常,这将被分配一个助记符名称

 fwrite=: 1!:2

J 使用它自己的编号系统输出描述符,标准输出是描述符 2。(类似地,文件读取是 1!:1,标准输入是描述符 1。)

在文件 io 的一般上下文中,必须显式指定换行符,但标准输出始终在结尾处包含一个隐式换行符。在 unix 下,写入 /dev/tty 以避免隐式换行符。

 'Hello world!' fwrite <'/dev/tty'
 ('Hello world!',LF) fwrite <'/dev/tty'

请注意,左箭头不代表重定向,而是代表将整个数组 '/dev/tty' 视为单个项目而不是字符序列。

所有 J 名词(数据)都是具有若干维度的数组(至少为 0)。左箭头用于封装这些数组之一。此操作称为装箱,它反映了这些结果的显示方式。

  < i. 3 4
+---------+
|0 1  2  3|
|4 5  6  7|
|8 9 10 11|
+---------+

一些基础算法已发布在 http://www.jsoftware.com/books/help/phrases/contents.htm

一般来说,算法是人们使用这种语言(或者任何语言)来实现的,因此这是一个开放式的主题

垃圾回收

[编辑 | 编辑源代码]

垃圾回收是自动的。

物理结构

[编辑 | 编辑源代码]

J 程序通常使用 .ijs 扩展名。类定义通常使用 .ijc。动态链接库使用操作系统使用的任何扩展名。其他扩展名也是可能的。

  • 从小处着手,尝试一些事情。不要过度学习

而不尝试。不要尝试太多事情,而不花时间学习。确保你花足够的时间做其他事情。

  • 当你开始编程时,随身携带操作列表。

网络参考

[编辑 | 编辑源代码]

书籍和文章

[编辑 | 编辑源代码]

J 软件出版物页面上提供了一些书籍。 J 软件出版物页面.

这些书籍涵盖从初学者到高级的范围。很多都是免费下载的。有些需要购买(例如,在亚马逊网站上链接到书籍)。

华夏公益教科书