J 語言

designer = Kenneth E. Iverson、

developer = JSoftware

typing = 動態型別

implementations = J

dialects =

family = APL

influenced by = SHARP APL

influenced = Dyalog APL, NARS2000, BQN, SuperCollider

operating system = 跨平臺: Windows, Linux, macOS

license = GPLv3

website =

wikibooks =

}}

J 語言，是一種陣列程式語言，由肯尼斯・艾佛森和於 1990 年代初發明。J 語言是 APL 語言的一種方言，延續了 APL 鮮明的簡潔性，它在數學和統計學程式設計上十分高效，特別是在需要進行矩陣運算的場合。

J 語言最初起步於肯尼斯・艾佛森在 1987 年發表的《APL 字典》，它實現了其中至關重要的秩的概念。

J 語言提供隱式定義機制包括秩、鉤子、叉子 Iverson and Whitney have made several earlier suggestions of ways to achieve what the fork form provides: the scalar operators of Iv78, Iv79a, Iv 79b, the til operator of Iv82, the union and intersection conjunctions of Iv87, and the yoke adverb of Iv88. Benkard Bk87 has also suggested a way to achieve the meaning of this form, in his proposal for ↑g/(f h)⍺ ⍵, using the notion of function pair (↑ is APL2’s first function). The present proposal has significant advantages over these earlier ones.|access-date=2022-06-09|archive-date=2022-06-12|archive-url=https://web.archive.org/web/20220612211237/https://www.jsoftware.com/papers/fork.htm|dead-url=no}} 和多種 The conjunction & is called with, and applies to nouns (variables) a and b as well as to verbs f and g as follows:a&g y is a g yf&b y is x f yf&g y is f g yx f&g y is (g x) f (g y)……A number of other constructs in J similarly enhance the utility of tacit definitions. The more important are the under (or dual), atop (a second form of composition), the power conjunction ^:, and further forms of partitions.|access-date=2022-06-11|archive-date=2022-07-06|archive-url=https://web.archive.org/web/20220706073137/https://www.jsoftware.com/papers/TacitDefn.htm|dead-url=no}}

，並介入了作為頭等物件的動名詞，用以建立控制結構

，它常被作為隱式程式設計的典範之一。

簡介

}}

J 語言的運算子，承襲 APL 傳統，沒有優先順序並且最右先行，2 3 + 4 按照 2 (3 + 4) 來運算。以歷史上 APL 使用的典型符號為例，符號 / 被用來指示摺疊函式 foldr1，所以 +/1 2 3 等價於 1 + (2 + 3)；在 APL 中，除法被表示為數學除號，它將減號和冒號一起在 EBCDIC 和 ASCII 二者的紙質文字終端上；J 語言使用 % 表示除法，是對除號的一種近似或提示。

為了避免 APL 使用特殊的字元而遇到的問題，J 語言只需基本的 ASCII 字元集，但使用點號。和冒號：作為 “屈折”。點號和冒號除了前導著空白字元的情況之外，都與緊前字元形成類似雙字元組的短字。多數 “基礎” 或 “原始” 的 J 單字，都充當數學符號，透過點號或冒號來擴充套件這些可用基本字元的含義。在其他語言中經常是成對的很多字元，比如 ""`` ，在 J 語言中被當作單獨的字，或者在有屈折的時候，作為多字元字的單字元字根。

J 語言不再支援從 1968 年的 APL\360 就有的；形式的方括號索引，轉而支援叫做 “來自”（from）的索引機制

，它起源自 Kenneth E. Iverson 於 1978 年在《運算元和函式》中提出的，依據基數解碼定義

J 語言的 #. 並未繼承 IBM 對 APL 解碼函式⊥的擴充套件規定，它可以實現為：

decode=:

，並用符號⌷表示的索引

J 語言在定義上述的⌷（from）之時，解碼前後不需要專門進行一元轉置⍉運算：

from=:

m=: 3 4$i.12

0 1 2 3

4 5 6 7

8 9 10 11

2 2 from m

10

3 2$3|i.6

0 1

2 0

1 2

(3 2$3|i.6) from m

1 8 6。

J 語言承襲 IBM APL\360 採用了平坦陣列模型，不支援由 NARS（巢狀陣列研究系統）於 1981 年介入，並被 IBM APL2 所採納的巢狀陣列模型 The arrays of APL2 are finite rectangular arrays which contain arrays as items. When the term array is used, it means this subset of all possible arrays.The arrays of APL2 are the same as the arrays of Array Theory and in particular empty arrays have structure as defined by Array Theory Mo1 etc..An array one of whose items is other than a single number or character (a simple scalar) is called a nested array. An array containing only numbers or containing only characters is called a homogeneous array. An array all of whose items are either single numbers or single characters is called a simple array. The arrays of APL1 are simple and homogeneous.In some sense every array in APL2 is nested because it contains other arrays. The term is reserved for those which contain at least one item which is not a single number or character. Thus the universe of arrays is partitioned into two subsets: simple arrays and nested arrays. ……A function is pervasive if pick distributes over it. ……Since the pick function may select an item at an arbitrary depth in a nested array, it may select deep enough to access a simple scalar (because nested arrays have finite depth). Thus a pervasive function may be thought of as applying independently to each simple scalar in its argument (s). ……In APL2 the scalar functions and only the scalar functions are pervasive.|access-date=2022-06-23|archive-date=2022-06-12|archive-url=https://web.archive.org/web/20220612090518/https://www.softwarepreservation.org/projects/apl/Papers/PRINCIPLESOFAPL2|dead-url=no}}；J 語言增加了 Kenneth E. Iverson 於 1978 年在《運算元和函式》中提出的盒裝資料型別，它由 SHARP APL 於 1981 年介入，並於 1983 年在研究報告《理性化 APL》中，列入與 APL2 相比較的 “限定子集”（RS）而著重強調。

J 語言支援 AVX2 指令集進行 SIMD 運算。為了包裝用面向物件程式語言開發的 API 和框架，J 語言提供了層級名稱空間機制，這裡所有名字都存在於特定語境（locale）中，可以避免軟體包之間的名字衝突，並能有效的用作基於類的面向物件程式設計的框架。

J 語言直譯器預設裝載標準庫 標準庫 。透過包管理器，還可以安裝各種外掛，如果是在管理員許可權下安裝的 J 語言直譯器，則安裝外掛也需要同樣的管理員許可權。J 語言擁有常規除錯機制，還有叫做 Dissect 的可視偵錯程式 Dissect 。除了科學計算和統計分析，它還被用於關係資料庫管理系統如 Jd、極限程式設計和網路效能分析。

2011 年 3 月，J 語言採用了 GNU 通用公共許可證版本 3，從而成為自由和開源軟體，人們還可以在 Jsoftware 的商業許可證下利用原始碼。

文件與詞類

J 語言的文件包括在官網的 NuVoc 中，在其中將主要的字羅列為 “J”，並使用顏色標示出它們分別的詞類。早期的文件還有入門和字典。在 J 語言中的字，被識別為名詞、動詞、定語（副詞和連詞）、系詞、標點、控制字。一個程式或例程，如果接受資料作為輸入併產生資料作為輸出，則被稱為 “動詞”，與之相對，資料引數被稱為 “名詞”。

動詞有兩種形式：只有右側一個引數的一元（monad）形式，和有左右兩側引數的二元（dyad）形式，例如在 - 1 中減號是一元動詞，而在 3-2 中減號是二元動詞。J 語言預定義了很豐富的動詞，它們都自動的作用於多種資料型別之上。使用者定義的程式可以自行命名，並用在任何允許使用原始動詞的地方。無論原始動詞還是派生動詞，它們的一元定義與二元定義，在很大程度上是獨立的。

起步示例

J 語言可以寫出非常精簡的程式，特別是存在重度的對符號的函式過載，以至於一些程式設計者將它稱為難以閱讀的只寫語言。在計算機的終端上執行 ijconsole，即可進入 J 語言的 REPL 直譯器介面。

3.1 Hello, World!

J 語言的 “Hello, World!” 程式：

'Hello, world!'

Hello, world!

這個 Hello World 的實現反映了 J 語言的傳統用法，就是把程序錄入到 J 直譯器會話中，顯示出表示式結果。還可以準備 J 指令碼來作為獨立程式來執行，比如在 Linux 系統上，可以編輯如下內容的一個文字檔案，並命名為比如 test01.ijs：

!/usr/bin/ijconsole

echo 'Hello, world!'

exit

注意第一行的 #! 必須頂頭，這裡的 echo 和 exit，是與 Unix shell 中同名命令功能類似的動詞。然後在終端介面中執行這個檔案：

$ ijconsole test01.ijs

Hello, world!

$ chmod +x test01.ijs # 另一種執行方式，授予這個檔案可執行許可權

$ ./test01.ijs

Hello, world!

3.2 平均

在 J 語言中函式一般稱為動詞，例如定義一個叫做 avg 的動詞，計算一序列數的平均：

avg=: +/ % #

avg 1 2 3 4

2.5

一元動詞 #“計數”（tally），總計陣列中專案的總個數。動詞 +“加”（plus）和副詞 /“插入”（insert），派生出的動詞 +/，合計這個陣列的專案的總和。二元動詞 %“除”（divide）將這個總和除以這個總個數。而使用者定義的動詞 avg，用到了由連串（strand）的三個動詞（+/、% 和 #）構成的一個 “叉子”（fork）。叉子 (f g h) y↔(f y) g (h y)，這裡的 f、g 和 h 指示動詞，而 y 指示一個名詞。

使用 avg 的一些例子：

a=: ?. 20 $100 NB. 產生 100 以內 20 個隨機整數的一個向量

94 56 8 6 85 48 66 96 76 59 33 72 63 1 89 52 17 20 9 65

avg a

50.75

4 avg\ a NB. 週期大小為 4 的移動平均

41 38.75 36.75 51.25 73.75 71.5 74.25 66 60 56.75 42.25 56.25 51.25 39.75 44.5 24.5 27.75

b=: ?. 4 5 $50 NB. 產生 50 以內 20 個隨機整數的一個矩陣

44 6 8 6 35

48 16 46 26 9

33 22 13 1 39

2 17 20 9 15

avg b

31.75 15.25 21.75 10.5 24.5

avg"1 b NB. 應用 avg 於 m 的每個秩為 1 的子陣列

19.8 29 21.6 12.6

一元副詞 /“插入”（insert），接受位於它左側的一個運算元，併產生將這個動詞應用於其引數的每個專案之間的一個動詞。就是說，+/ 是一個動詞，定義為應用 + 於給它的引數的各個專案之間。計算移動平均用到的二元副詞 \“中綴”（infix），將作為資料引數的列表劃分成一系列的指定大小的連續專案的子列表，將所修飾動詞應用於其上，並將這些結果形成一個列表。

一元動詞 “相同”（same），恆等於給它的單一右引數，常像這樣用來在賦值之後顯示變數的內容。一元動詞？.“擲骰 / 固定種子”（roll/fixed seed），不同於一元動詞？“擲骰”（roll），在生成資料引數專案所指定大小範圍內的隨機數之時，採用固定的種子。這裡確定對矩陣按行還是按列進行平均，用到了連詞 "“秩”（rank），它在後面的定語章節和單獨條目中論述。

3.3 查詢與排序

二元動詞 i.“出現索引”（index of），和二元動詞 i:“最後出現索引”（index of last），在任何大小的陣列內查詢匹配者，並返回它的位置索引，如果未找到匹配者，則返回這個陣列的大小。例如：

a=: 3 1 4 1 5 9

a i. 1 2 NB. 找到 1 和 2 的第一次出現的索引

1 6

a i: 1 2 NB. 找到 1 和 2 的最後一次出現的索引

3 6

在 J 語言中，排序可以按 APL 傳統的兩步驟方式，使用一元動詞 /:“升序索引”（grade up）或 \:“降序索引”（grade down），和用二元副詞～“被動” 修飾的二元動詞 {“出自”（from），二者連串（strand）形成的一個 “鉤子” 來完成。一元鉤子 (f g) y↔y f (g y)；副詞～“反身・被動”，其一元定義為 f~ y↔y f y，二元定義為 x f~ y↔y f x。J 語言還提供專用的二元動詞 /:“上升排序”（sort up）或 \:“下降排序”（sort down）。下面是用例：

a=: 2 0 4 7 15 9 8 0 4 9 18 8 1 18

/: a NB. 產生引數陣列的升序索引

1 7 12 0 2 8 3 6 11 5 9 4 10 13

({~ /:) a NB. 從引數陣列中按升序索引選取出各個專案

0 0 1 2 4 4 7 8 8 9 9 15 18 18

/:~ a

0 0 1 2 4 4 7 8 8 9 9 15 18 18

(a - 10) /: a

10 10 9 8 6 6 3 2 2 1 _1 5 8 8

3.4 CSV 外掛

安裝用來支援 CSV 檔案的外掛 Addons/tables/csv ：

load 'pacman' NB. 載入包管理器

'install' jpkg 'tables/csv' NB. 安裝 CSV 檔案外掛

'showinstalled' jpkg NB. 檢視已經安裝外掛

一個 CSV 檔案簡單用例：

load 'tables/csv' NB. 載入 CSV 外掛

a=: i. 2 3

a writecsv jpath '~/test01.csv' NB. 將一個陣列寫入一個 CSV 檔案

12

b=: readcsv jpath '~/test01.csv' NB. 從一個 CSV 檔案讀入一個盒子陣列

┌─┬─┬─┐

│0│1│2│

├─┼─┼─┤

│3│4│5│

└─┴─┴─┘

c=: makenum b NB. 儘可能的將盒子陣列轉換成數值陣列

0 1 2

3 4 5

下面演示使用 J 語言編寫在管道中的過濾器，例如，在具有隱式程式設計機制 Unix 管道的 Linux 系統中，建立如下內容的文字檔案，並命名為比如 filter01.ijs：

!/usr/bin/ijconsole

load 'tables/csv'

stdout makecsv 10 + makenum fixcsv stdin

exit

然後在終端介面中執行如下命令列：

$ cat test01.csv | ijconsole filter01.ijs

10,11,12

13,14,15

資料型別

J 語言支援三種簡單型別：

數值
文字（字元）
盒裝

其中數值有很多變種。J 語言提供的唯一搜集（collection）型別，是任意維度的陣列。多數演算法可以使用這些陣列來簡潔的表達。

4.1 數值

J 語言的數值型別之一是 “位”。位有兩個值：0 和 1。位還可以形成列表，例如 1 0 1 0 1 1 0 0，是 8 個位的列表。在語法上，J 分析器將位當作一個字。空格字元被識別為字形成字元，它處在屬於其他數值字的字元之間。

J 語言支援任意長度的列表。J 語言進一步的在這些位列表之上，支援所有常見二元運算，比如動詞 *.“與”（and）、+.“或”（or）、-.“非”（not）、|.“反轉・旋轉”（reverse・rotate）、|.!.f “移位”（shift）等。J 語言還支援位的二維、三維等陣列。上面的運算同樣執行在這些陣列之上。

4.2 文字

J 語言還支援文字即字元型別。文字包圍在撇號 ' 之間，比如 'a' 或 'b'。文字的列表，透過將多個字元用撇號包圍起來的常規字串約定來表示，比如 'abcdefg'。在字串內的表示字元本身。單個的文字，典型的是 8 位寬即單位元組的 ASCII 字元，此外 J 語言還支援 Unicode 文字。

不支援在文字上的數值和布林運算，但支援面向蒐集的運算，比如旋轉等。使用動詞 ".“執行・數值”（do・numbers），將位元組陣列轉換成數值；使用動詞":“預設格式・格式”（default format・format），將數值轉換成位元組陣列。

4.3 盒裝

盒裝型別的值是 0 維標量，而不管所包含的是怎樣的資料結構。使用一元動詞 “盒裝”（box），將資料放置入盒子中；使用一元動詞 >“開啟”（open），開啟盒子中取出其中資料。還可以透過二元動詞；“連結”（link）建立盒子的列表，透過一元動詞；“拆除”（raze）移除一層盒子的列表。盒子內可以裝入其他盒子，還可以透過二元動詞 $“重製形狀”（reshape）和二元動詞 #“計件複製”（copy）等操作盒子及其列表。

4.4 陣列

J 語言的陣列，具有同質（homogeneous）的專案型別，例如列表 1 2 3 是整數的列表，儘管 1 還可以是一個位。這種型別問題，在極大程度上對於程式設計者是透明的。只有特定的特殊運算，會顯露出在型別上的不同。例如列表 1.0 0.0 1.0 0.0，對大多數運算，將被當作是完全同於列表 1 0 1 0。

J 語言支援數值稀疏陣列，透過它們的下標儲存非零數值。這在非零數值相對很少的情況下，是有效率的機制。

4.5 其他

J 語言還支援類和物件，但是它們並非資料型別，實際上使用盒裝文字來提及類和物件，它們實為命名語境和編號語境。

此外還有一個偽型別即記憶體對映檔案，它將變數對映到檔案系統中的持久檔案 記憶體對映檔案 。

簡要詞彙表

下面的表格簡要列出了常用詞彙。如果含義中用了間隔號（・）分隔，通常前者是隻有一個右側引數的一元含義，後者是左右兩側都有引數的二元含義。列出的對應 APL 符號，是 Dyalog 等現代 APL 所採用的符號。

5.1 基本

5.2 數學

5.3 結構

5.4 選取

5.5 索引

5.6 運算元

5.7 雜類

定語

J 語言的能力，很大程度上來自它的 “定語”（modifier：修飾詞），這個範疇包括 “副詞” 和 “連詞”：這些符號接受名詞和動詞作為運算元（operand），並以指定方式應用這些運算元。定語都可以應用於任何動詞，包括使用者寫的動詞，使用者可以寫自己的定語。

J 語言的二元動詞有右結合性，或稱為儘量長右作用域，即它有儘可能多的右引數。定語即運算元有左結合性，或稱為儘量長左作用域，即它有儘可能多的左運算元。如果表示式中存在定語即運算元，首先應用這些定語，然後應用其生成的動詞。

6.1 副詞

一元副詞 /“插入”（insert），副詞 \“字首・中綴”（prefix・infix），副詞 \.“字尾・外綴”（suffix・outfix），和連詞；.“剪下”（cut），指定引數的諸個規則或不規則子集，並在其上執行運算。在 J 語言實現中，+/\、極小值和極大值 >./\ 運算，是典型的會對其進行速度最佳化的特殊組合。

副詞～“反身・被動”（reflex・passive），其一元形式 f~ y↔y f y，將提供給動詞的右引數重複放置在左引數位置上；二元形式 x f~ y↔y f x，將提供給動詞的左右兩個引數對換位置。

6.2 秩

名詞的秩（rank）是排布其原子所依據的軸的數目，即它的形狀中專案的數目。動詞的秩是它能夠在其上直接運算的右（和左）名詞引數的最高秩，典型的表示為三個原子的一個列表：一元秩 二元左秩 二元右秩。對副詞和連詞標示的秩，是所形成的動詞的秩。

秩在特定動詞和特定名詞的上下文下，將名詞的諸維，劃分成字首諸維的序列，稱為框架（frame）；和字尾諸維的序列，稱為單元（cell）。秩採用連詞 "“秩” 來操縱，對應於 APL 符號⍤，它有三種形式：u"n “指定秩”（assign），m"n “常量動詞”（constant），u"v 和 m"v “複製秩”（copy），這裡的 u、v 表示動詞運算元，而 m、n 表示名詞運算元。正數動詞秩，指示單元諸維的數目，負數動詞秩，指示框架諸維的數目，_指示整體。

二元動詞的左右引數的框架經常是匹配的，就是說二者有相同的形狀，從而保證了它們有相同數目的單元。如果左右引數的框架不匹配，有三種可以運算的情況：

標量一致，如果指定了兩引數中某一側的框架為空，即秩為_，這一個整體單元被應用於另一側引數的所有單元。
字首一致，兩引數中有一側的短框架是另一側長框架的字首，短框架的每個單元，被應用於對應的長框架去掉字首餘下諸維形成的單元陣列的所有單元。
字尾一致，兩引數中有一側的短框架是另一側長框架的字尾，這時需要以兩側加上相同正數增量的方式指定秩，使原短框架側的框架為空，原短框架的諸維形成的這一個單元陣列，被應用於原長框架去掉字尾餘下諸維形成陣列的每個單元陣列。

6.3 複合連詞

連詞 @:“在於”（at）、@“頂上”（atop）、&:“並列”（appose）、&“合成”（compose），是四種複合（composition）。J 語言支援叫作 “鉤子”（hook）和 “叉子”（fork）的隱形連詞，二種隱形連詞和四種複合連詞，規定了如何將引數或將所飾動詞應用於引數的結果，提供給所飾動詞來進行應用的規則。下表列出它們的定義：

在上面表格中，mv=: 0 {v b.0，lv=: 1 {v b.0，rv=: 2 {v b.0，這裡的副詞 b.0 給出動詞 v 的三個秩。在應用四種複合連詞形成新動詞的表示式中，@: 和 &:，要對第一步運算的中間結果，按所在子表示式的秩或整個表示式的秩_進行彙集（assembly），並在有需要的情況下進行框架填充，然後在這個彙集成的框架內進行第二步運算；而 @和 &，直接在第一步運算的框架內，對中間結果進行第二步運算；在整個表示式求值結束時，最終結果在有需要的情況下要進行整體填充。

在中，一元 u 直接在二元 v 所劃分的框架內進行自己的運算。在中，@: 將二元 v 的運算結果，彙集成 "v 所指定的框架。在，二元 u 直接在一元 v 所劃分的兩個框架內進行自己的運算。在中，&: 將一元 v 的兩個運算結果，彙集成"mv 所指定的框架。

下面例子展示四種複合的中間結果的單元差異：

a =: >:i. 2 3

1 2 3

4 5 6

b =: 0.1*>:i. 2

0.1 0.2

a (當連詞 & 的一個運算元是名詞的時候，表示 “粘上”（bond），它透過向二元動詞固定提供其一個引數的值而產生一個動詞：

& 派生的動詞經常作為一元動詞使用，即或；如果作為二元動詞使用，即或，左引數表示應用這個派生動詞於右引數的次數。需要確保透過 & 定義的一元動詞，不出現在能夠取用左右兩個的引數的上下文中；如此定義的二元動詞，也不應該出現在只能取用一個右引數的上下文中。需要注意 m&v、v / 和 v\ 等的左引數的作用域，有時遇到其左側的複合連詞會產生並非預期的效果，經常需要將表示式整體加以圓括號包圍。

J 語言還提供連詞 &.:“底下”（under）和 &.“對偶”（dual）。下面定義中的動詞冪 ^:_1 表示逆運算：

@、& 和 &. 合稱為 “緊密複合”（close composition）。現代 APL 中另有 ¨“每個”（each），f¨ 相當於 J 語言中的 f &.>。例如：

1 2 + &.:> 0.1 0.2

┌───────┐

│1.1 2.2│

└───────┘

1 2 + &.> 0.1 0.2

┌───┬───┐

│1.1│2.2│

└───┴───┘

在 J 語言中，孤立的動詞序列叫做 “列車”（train）， e f g h 意味著 (e (f g h))，d e f g h 意味著 (d e (f g h))；以此類推，動詞列車的一般模式 (a b c ...)，依賴於動詞的數目，在偶數時形式為 (a (b c ...))，最外層是個鉤子；而在奇數時形式為 (a b (c ...))，最外層是個叉子；二者的內部都是可能有多層的巢狀的叉子。

叉子、@: 再加上和，可以將很多常用複合寫為列車。在慣用法 (: f g) 中，並不實際執行的隱式動詞:“遮帽”（cap），遮蔽了叉子的左分支，形成了等價於 f @: g 的特殊化叉子。

與現代 APL 如 Dyalog 等對照，複合連詞 @: 對應於同秩連詞共享 APL 符號⍤的 “頂上”（atop），而 &: 對應於⍥“上方”（over），共享 & 符號的 “粘上”，對應於 APL 中的 “綁上”（bind），APL 的 “綁上” 和 “邊上”（beside）共享符號∘，“邊上” 的一元形式同於⍤，而二元形式同於鉤子。在《APL 字典》中，@對應其⍥，而 & 列入秩連詞⍤之內，鉤子對應於符號⍩“枝條”（withe），&. 對應於符號 ¨。

6.3.1 用例

下面的簡單例子是計算歐幾里得範數，和生成數位與維度座標一致的整數：

d=: (1 1),(1 1 1),:(3 4)

1 1 0

1 1 1

3 4 0

norm=: %: @ (+/) @: :"1 NB. 它可加圓括號為 ((%: @ (+/)) @: :)"1

norm d

1.41421 1.73205 5

coor=: 10&#. @ > @ {@: (: @ i."0)

coor 2 3 4

111 112 113 114

121 122 123 124

131 132 133 134

211 212 213 214

221 222 223 224

231 232 233 234

在 coor 中採用的圓括號包圍，使得 @: 處在整個表示式的最外層，從而形成了兩步驟運算；右側的第一步是圓括號包圍的子表示式，它的完全加圓括號（fully-parenthesized）形式為：(((:) @ i.)"0)；左側的第二步是 {與複合到其上諸運算構成的子表示式，它的完全加圓括號形式為：(((10 & #.) @ >) @ {)。一元動詞 {“目錄彙編”（catalogue），應用在盒裝列表的列表之上，是接受可變數目的變長引數的典型的動詞。

下面透過對圓括號包圍的子表示式加以變化，辨析秩連詞和複合連詞的特性。這裡的動詞，劃分開了給連詞或副詞的名詞運算元，和給所生成的動詞的名詞引數：

a=: : @ i."0 2 3 4 NB. 運算式可加圓括號為 ((:) @ i.)"0

┌───┬─────┬───────┐

│1 2│1 2 3│1 2 3 4│

└───┴─────┴───────┘

a -: : @ i.)"0 2 3 4 NB. 運算式可加圓括號為 (: @ i.))"0

1

a -: : @ i."0) 2 3 4 NB. 運算式可加圓括號為: @ i.)"0)

1

: @ i."0 2 3 4 NB. 運算式可加圓括號為 ((:) @ i.)"0

┌─┬─┬─┬─┐

│1│2│ │ │

├─┼─┼─┼─┤

│1│2│3│ │

├─┼─┼─┼─┤

│1│2│3│4│

└─┴─┴─┴─┘

: @ i."0) 2 3 4 NB. 運算式可加圓括號為: @ i.)"0)

┌───────┐

│1 2 0 0│

│1 2 3 0│

│1 2 3 4│

└───────┘

下面的例子展示並聯電阻電路計算：，它可以如下這樣表達：

Rtotal=: +/ &.: %

Rtotal 10 5 15

2.72727

6.4 動詞冪

連詞 ^: 動詞冪”（power of verb），有兩種形式：

^:n，是運算元為名詞的 “固定冪”。
^:v，是運算元為動詞的 “動態冪”。

對於固定冪 u ^:n，如果 x 缺席，u ^:n y 在以 y 為運算物件的迭代中，將動詞 u 應用 n 次；如果 x 存在，x u ^:n y 在以 y 為運算物件的迭代中，將動詞 x&u 應用 n 次。如果 n 是陣列，則按每個原子專案都執行一次動詞冪，結果的框架為這個陣列的形狀；如果 n 是取值為 0 或 1 的變數，則形成布林值條件執行；如果 n 是1，則進行 u 的逆運算；如果 n 是，則意味著 “收斂”（converge），即反覆應用 u 直到結果不再變化。例如：

(1+*&3) ^:0 1 1 2 3 4

1 2 3 4

4 7 10 13

' ' , ^:4 'abc'

abc

(1+*&3) ^:_1 4 7 10 13

1 2 3 4

(-:@(+%)) ^:_ &1 0.25 3 25 NB. 以巴比倫方法即一種牛頓法特例來計算平方根

0.5 1.73205 5

對於動態冪 u ^:v，如果 x 缺席，u ^:v y 在以 y 為運算物件的迭代中，將動詞 u 應用 v y 次；如果 x 存在，x u ^:v y 在以 y 為運算物件的迭代中，將動詞 x&u 應用 x v y 次。動詞冪可以形成動態條件執行，這裡的動詞 v 必須總是產生布爾值結果，應用動詞 u 當且僅當 v 返回 1。進而 u ^:v ^:_ y 可以形成 while 迴圈構造，只要 v 返回 1，就反覆的執行 u，直到 v 返回 0，或者 u 將它的引數無變化的返回。例如：

-&2 ^:(>&4) "0 1 3 6 12 NB. 對大於閾值 4 的列表專案減去 2

1 3 4 10

4 (0.25&@+(1-0.25)&@) ^:

6.4.1 用例

下面的例子用來辨析秩指定與框架劃分及彙集的性質，其中涉及的直接定義等內容可見於後面的定義章節：

itemize=: ,: : "(0 _) NB. 定義具有一元和二元兩種形式的專案化擴秩運算

@

6.5 動名詞

在 J 語言中，動名詞（gerund）是叫做 “原子表示” 的特殊盒子的一個列表，這種盒子可以像任何其他盒子一樣使用，並可以最終轉變回到要執行的動詞。關於動名詞的運算有：

連詞 `“連結動名詞”（tie or gerund），建立動名詞。
連詞 `:“喚起動名詞”（evoke gerund），在加以運算元之後成為：
`:6，將動名詞轉變成動詞列車；
`:0，將轉變回來的這些動詞分別單獨應用，並將它們的結果收集入一個列表。
連詞 @.“議程”（agenda），m @. n 從動名詞 m 中，選擇出第 n 個原子表示，將它轉變回到動詞並執行它。

下面是動名詞簡單示例和考拉茲猜想示例：

grd =: * ` (+&2) NB. 建立一個動名詞

grd NB. 顯示原子表示，這裡的符號 '0' 標識名詞

┌─┬─────────────┐

│*│┌─┬─────────┐│

│ ││&│┌─┬─────┐││

│ ││ ││+│┌─┬─┐│││

│ ││ ││ ││0│2││││

│ ││ ││ │└─┴─┘│││

│ ││ │└─┴─────┘││

│ │└─┴─────────┘│

└─┴─────────────┘

{. grd NB. 動名詞可以像普通盒子一樣操縱

┌─┐

│*│

└─┘

grd `:6 i. 4 NB. 將動名詞轉換成動詞列車來執行

0 3 8 15

grd `:0 i. 4 NB. 將動名詞轉換成並行執行的動詞

0 1 1 1

2 3 4 5

Collatz=: -: ` (1+*&3) @. (2&|) NB. 考拉茲猜想的算式

Collatz "0 1 2 3 4 5 6 7

4 1 10 2 16 3 22

>./@(Collatz^:(>&1)^:_"0@>:@?@$&1e6) 1000 NB. 取 1000 個在 1e6 內的隨機數測試考拉茲猜想

1

定義

J 語言支援使用者進行顯式定義

，和形式的

are reserved for delimiters, and text found between is taken to define a verb/adverb/conjunction. The text may be multiple lines long and may contain other embedded definitions. The part of speech of the defined entity is inferred from the words in it.|access-date=2022-06-30|archive-date=2022-07-03|archive-url=https://web.archive.org/web/20220703015845/https://code.jsoftware.com/wiki/System/ReleaseNotes/J902|dead-url=no}}。

下面以五種複合作為顯式定義的例子：

at=: conjunction define

u (v y)

:

u (x v y)

)

atop=: conjunction def '(u at v)"v'

beside=: conjunction define

u (v y)

:

x u (v y)

)

appose=: conjunction define

u (v y)

:

(v x) u (v y)

)

compose=: conjunction def '(u appose v)"(0 {v b.0)'

下面以矩陣乘法作為直接定義的例子，並順帶演示秩連詞的用法：

a=: ? @ $&1000 @: >: 4?10

b=: |: a

p=: a (+/. *) b

matmul=:

(a (+/matmul *) b) -: p

1

inner=:

(a (+/inner * 0&|:) b) -: p

1

outer=:

(a (+/outer *) b) -: p

1

revmul=:

(a (+/revmul * 0&|:) b) -: p

1

APL 傳統上的將內積解釋為，J 語言的矩陣乘法要求寫為，不隱含的為左運算元 f 附加一元 /。轉置也是有較大的運算，不同的有不同的參照區域性性。

matmul 透過 "(1 _) 將 u@:v 的右引數從向量擴充套件為一般陣列，它用於右引數為陣列的情況。在向量與向量列表二者諸項之間逐對的進行乘積累加運算，是 BLAS 的標準演算法。
inner 採用了兩向量之間的點積運算 u@:v"1，它適宜直接用於右引數為陣列的情況。在右引數為行主序陣列之時，需要如例子程式碼這樣，對右引數陣列進行二元轉置 0&|:，這裡的 0 指示將第一軸安排至最後位置而其他軸保持原序前移。這種基於點積的實現，通常需要進一步加以。
outer 可以看作 matmul 的變體，它首先對左引數陣列進行轉置，然後進行多組的向量與一般陣列之間二元的張量積運算 v/"_1，最後在各組結果的列表上進行 u 計算，每組運算之後參與其中的左右兩陣列的元素不會被其他組的運算再次訪問。
revmul 同 inner 一樣適宜直接用於右引數為列主序陣列的情況，但採用了同 matmul 類似的計算方法，它在乘法之前對左引數陣列和在乘法之後對結果要做轉置，matmul 與 revmul 的關係如同。matmul 一次性訪問左引數陣列，反覆多次訪問右引數陣列；revmul 一次性訪問右引數陣列，反覆多次訪問左引數陣列。

在隱式定義中，遞迴定義可以不透過名字引用自身，轉而使用動詞 $:“自引用”。例如遞迴的計算斐波那契數列：

fibonacci=: 1: `($:@-&2 + $:@&2)"0 : :

fibonacci >:i.9

1 1 2 3 5 8 13 21 34

_9: 到 9: 是常量動詞。動詞:“遮帽”，用在連詞 u : v “一元與二元定義” 所應用的動詞位置上，即充任了一元動詞 u 或二元動詞 v，可分別在如下兩種情況下報錯：定義的是二元動詞，卻不適當的被用作一元動詞；或定義的是一元動詞，卻不適當被用作二元動詞。

在顯式定義和直接定義中，提供了類似其他過程語言的控制結構。這裡列出的是每個範疇內的代表性控制字：

索引

J 語言的索引機制採用二元 {“來自”（from）動詞來完成，它的秩為 0 _，它有兩種形式，分別為左引數為索引陣列的主軸索引，和左引數為二層或一層盒裝結構的逐軸索引，二者分別對應 APL 中，方括號內為單個軸的主軸索引選取，和方括號內為；分隔的多個軸的逐軸索引選取。

8.1 主軸索引

索引陣列的每個專案指定對主軸的專案單元的一個選取，將它們的結果再匯合為一個陣列。負值索引表示從末尾往前記數。在 APL 中，這種形式的索引被稱為 “來自”（from），也叫做 “選取”（select）或幽默地稱為 “明智”（sane）索引，最早出現在 SAX（SHARP APL for UNIX）對其 @“來自” 索引的擴充套件中，部份現代 APL，將它表示為符號⊇。例如：

i. 2 3

0 1 2

3 4 5

1 0 { i. 2 3

3 4 5

0 1 2

1 0 {"1 i. 2 3

1 0

4 3

(i. 2 3) { 'abcdefg'

abc

def

_1 { 'abcdefg'

g

8.2 逐軸索引

逐軸選取可以形成子陣列，在現代 APL 中，它被表示為⌷，故而也被稱為 “扁方塊”（squad：squish quad）索引（indexing）或就叫做 “索引”（index）函式。裝在二層盒裝結構中的，是對應諸軸的一層盒裝子結構的列表，其中每個一層盒裝子結構內都是數值列表，它對應在此軸內一個或多個專案選擇。預設全選使用名詞 a:“麼點”（ace）指示，它是盒裝空列表。在尾部的連續多個預設全選不需要寫出。例如：

i. 3 4

0 1 2 3

4 5 6 7

8 9 10 11

(

它還支援一層盒裝結構，裝在其中的是數值列表，它的元素指示每軸選取一個專案，如果單選了所有軸，則指定一個原子專案。一層盒裝結構中的這個數值列表，等價於二層盒裝結構中一層盒裝的單一數值的列表。兩種索引形式可以結合使用，即可以將盒裝結構的陣列作為給 {的左引數，它按這個陣列的形狀匯合多個逐軸選取的結果。例如：

(

例如 (這樣的選取是合法的，將形狀不一致的選取結果匯合在一起，會導致結果值填充。

8.3 重排軸

重排軸也叫做二元轉置。APL 的二元轉置對軸次序的指定，類似於組合數學中置換的一行形式的柯西表示法

Table 3.9 shows the detailed definitions of transposition for a variety of cases. ……

-

Case

⍴R

Definition

-

R←1⍉V ⍴V R←V

-

R←1 2⍉M ⍴M R←M

-

R←2 1⍉M (⍴M) 2 1 RI;J←MJ;I

-

R←1 1⍉M ⌊/⍴M RI←MI;I

-

R←1 2 3⍉T ⍴T R←T

-

R←1 3 2⍉T (⍴T) 1 3 2 RI;J;K←TI;K,J

-

R←2 3 1⍉T (⍴T) 3 1 2 RI;J;K←TJ;K;I

-

R←3 1 2⍉T (⍴T) 2 3 1 RI;J;K←TK;I;J

-

R←1 1 2⍉T (⌊/(⍴T) 1 2),(⍴T) 3 RI;J←TI;I;J

-

R←1 2 1⍉T (⌊/(⍴T) 1 3),(⍴T) 2 RI;J←TI;J;I

-

R←2 1 1⍉T (⌊/(⍴T) 2 3),(⍴T) 1 RI;J←TJ;I;I

-

R←1 1 1⍉T ⌊/⍴T RI←TI;I;I

}，它被稱為 “可能是 APL 程式設計者最後掌握的原始運算之一”。J 語言的二元轉置對軸次序的指定，不涉及將多個軸對映到結果中的一個軸的情況，使用了普通的索引形式的置換向量

上面的 APL 轉置⍉運算規定中，不將多個軸對映到結果中的一個軸的簡單示例，所對應的 J 語言程式碼：

transpose=:

a=: >:i. 2 3 5 7

$ a

2 3 5 7

p=: 2 3 4 1

$ p transpose a

7 2 3 5。

在置換向量的元素個數小於陣列軸的數目之時，J 語言在置換結果中將其指定的諸軸安排在尾部，而其他軸保持原來相對次序前移。

針對向量的索引運算，是不加盒裝的主軸索引。要訪問一般陣列的特定原子專案，其選取向量需要一層盒裝，從而對其進行逐軸索引。置換向量 p 所對應的逆向置換向量是，對於兩個置換向量 p 和 q，則有 ↔ 。

二元轉置與索引機制有密切關聯，它有兩個重要性質

Kenneth E. Iverson 的上述二元轉置定義，用 J 語言寫為 ↔ ，而恆等式 ↔ 的推導過程相應如下：

(：

兩次連續的二元轉置，可以變換成等價形式： ↔ ，即先將後者置換向量 p 對前者置換向量 q 進行置換，然後用結果的置換向量做一次二元轉置。
對二元轉置後的陣列，進行原子專案的選取，可以變換成等價形式： ↔ ，即先用置換向量 p 的逆置換向量 /:p，對選取向量 k 進行置換，然後用結果的選取向量來選取未轉置陣列。

下面是演示例子程式碼：

a=: ? @ $&1000 @: >: 4?10

n=: # @ $ a

p=: ?~ n

q=: ?~ n

(/:/:p) -: p

1

((/:p) {p) -: i. n

1

(/: p {q) -: (/:q) { /:p

1

(p |: q|:a) -: (p {q) |: a

1

k=: ? $ p |: a

((

示例

9.1 帕斯卡三角

下面例子形成帕斯卡三角的二項式係數的直接定義，並順帶展示基本的矩陣與盒裝運算：

pascal=: "0

pascal @ i. 5

1 0 0 0 0

1 1 0 0 0

1 2 1 0 0

1 3 3 1 0

1 4 6 4 1

({. (+//. @: pascal @ i.)) 9 NB. 斐波那契數列

1 1 2 3 5 8 13 21 34

((+/. *) |:) @: pascal @ i. 5 NB. 帕斯卡矩陣

1 1 1 1 1

1 2 3 4 5

1 3 6 10 15

1 4 10 20 35

1 5 15 35 70

}:@,@:(,.&a:@) t

┌─┬─┬─┬─┬─┬─┬─┬─┬─┐

│ │ │ │ │1│ │ │ │ │

├─┼─┼─┼─┼─┼─┼─┼─┼─┤

│ │ │ │1│ │1│ │ │ │

├─┼─┼─┼─┼─┼─┼─┼─┼─┤

│ │ │1│ │2│ │1│ │ │

├─┼─┼─┼─┼─┼─┼─┼─┼─┤

│ │1│ │3│ │3│ │1│ │

├─┼─┼─┼─┼─┼─┼─┼─┼─┤

│1│ │4│ │6│ │4│ │1│

└─┴─┴─┴─┴─┴─┴─┴─┴─┘

二項式係數也可以寫成隱式定義形式：

pascal=: ((0&, + ,&0)@ ^: 1:)"0 : :

9.2 簡易圖表

下面是基於二元副詞 /“形成表格”（table），製作條形圖和散點圖的簡易圖表例子:

barChartH=: {&('.',u:16b2584) @ (>/i.@(>./)) : :

barChartH 3 1 4 1 5 9 2 6 5

▄▄▄......

▄........

▄▄▄▄.....

▄........

▄▄▄▄▄....

▄▄▄▄▄▄▄▄▄

▄▄.......

▄▄▄▄▄▄...

▄▄▄▄▄....

barChartV=: {&('.',u:16b258c) @ (./)) : :

barChartV 3 1 4 1 5 9 2 6 5

.....▌...

.....▌...

.....▌...

.....▌.▌.

....▌▌.▌▌

..▌.▌▌.▌▌

▌.▌.▌▌.▌▌

▌.▌.▌▌▌▌▌

▌▌▌▌▌▌▌▌▌

scatterChart=: {&('.',u:16b2588) @ (=/~>:@|.@i.@(>./)) : :

scatterChart 3 1 4 1 5 9 2 6 5

.....█...

.........

.........

.......█.

....█...█

..█......

█........

......█..

.█.█.....

這裡用到的 Unicode 方塊元素字元也出現在 IBM PC 內碼表 437 之中。

這裡的 scatterChart 可以使用二元副詞}“修改”（amend）來實現：

scatterChart=: {&('.',u:16b2588) @ ((>./ , #) } (#~ ./) ,. i.@#)) : :

9.3 對角線選取

APL 的二元轉置，在多個軸對映到結果中的一個軸的情況下，將其依次安排到前導位置上並進行對角線選取。下面基於一元動詞 I.“真值位置索引”，定義進行對角線選取的動詞 diag，它的左引數是布林值列表，其中的真值 1 指示與其位置對應的軸，要依次安排在前導位置上並進行對角線選取，其他的假值 0 所對應的軸相對位置不變。

diag=: