J 語言，是一種陣列程式語言，由肯尼斯艾佛森和於 1990 年代初發明。J 語言是 APL 語言的一種方言，延續了 APL 鮮明的簡潔性，它在數學和統計學程式設計上十分高效，特別是在需要進行矩陣運算的場合。 J 語言最初起步於肯尼斯艾佛森在 1987 年發表的《APL 字典》，它實現了其中至關重要的秩的概念 。J 語言提供隱式定義機制包括秩、鉤子、叉子和多種 ，並介入了作為頭等物件的動名詞，用以建立控制結構 ，它常被作為隱式程式設計的典範之一。 簡介 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 年的 APL360 就有的 形式的方括號索引，轉而支援叫做 來自（from）的索引機制 ，它起源自 Kenneth E Iverson 於 1978 年在《運算元和函式》中提出的，依據基數解碼定義 J 語言的 並未繼承 IBM 對 APL 解碼函式的擴充套件規定，它可以實現為： decode x 1 _ 0 y ，並用符號表示的索引 J 語言在定義上述的（from）之時，解碼前後不需要專門進行一元轉置運算： from y x 0 _ y m 3 4i12 0 1 2 3 4 5 6 7 8 9 10 11 2 2 from m 10 3 23i6 0 1 2 0 1 2 3 23i6 from m 1 8 6 。 J 語言承襲 IBM APL360 採用了平坦陣列模型，不支援由 NARS（巢狀陣列研究系統）於 1981 年介入 ，並被 IBM APL2 所採納的巢狀陣列模型；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 中 NuVoc ，在其中將主要的字羅列為 J，並使用顏色標示出它們分別的詞類詞類。早期的文件還有入門和字典。在 J 語言中的字，被識別為名詞名詞、動詞動詞、定語定語 （副詞和連詞）、系詞、標點、控制字。一個程式或例程，如果接受資料作為輸入併產生資料作為輸出，則被稱為 動詞，與之相對，資料引數被稱為 名詞。 J 術語 APL 術語 名詞 陣列 動詞 函式 副詞，連詞 運算元 字母 字元集 單詞構成 詞法分析（lexing） 標點 控制結構，括號界定等 句子 表示式 字典 參考手冊 雋語（epigram） 單行程式碼（oneliner） 動詞有兩種形式：只有右側一個引數的一元（monad）形式，和有左右兩側引數的二元（dyad）形式，例如在 1 中減號是一元動詞，而在 32 中減號是二元動詞。J 語言預定義了很豐富的動詞，它們都自動的作用於多種資料型別之上。使用者定義的程式可以自行命名，並用在任何允許使用原始動詞的地方。無論原始動詞還是派生動詞，它們的一元定義與二元定義，在很大程度上是獨立的。 起步示例 J 語言可以寫出非常精簡的程式，特別是存在重度的對符號的函式過載，以至於一些程式設計者將它稱為難以閱讀的只寫語言。在計算機的終端上執行 ijconsole，即可進入 J 語言的 REPL 直譯器介面。 Hello World J 語言的 Hello World 程式： Hello world Hello world 這個 Hello World 的實現反映了 J 語言的傳統用法，就是把程序錄入到 J 直譯器會話中，顯示出表示式結果。還可以準備 J 指令碼來作為獨立程式來執行，比如在 Linux 系統上，可以編輯如下內容的一個文字檔案，並命名為比如 test01ijs： usrbinijconsole echo Hello world exit 注意第一行的 必須頂頭，這裡的 echo 和 exit，是與 Unix shell 中同名命令功能類似的動詞。然後在終端介面中執行這個檔案： ijconsole test01ijs Hello world chmod x test01ijs 另一種執行方式，授予這個檔案可執行許可權 test01ijs Hello world 平均 在 J 語言中函式一般稱為動詞，例如定義一個叫做 avg 的動詞，計算一序列數的平均： avg avg 1 2 3 4 25 一元動詞 計數（tally），總計陣列中專案的總個數。動詞 加（plus）和副詞 插入（insert），派生出的動詞 ，合計這個陣列的專案的總和。二元動詞 除（divide）將這個總和除以這個總個數。而使用者定義的動詞 avg，用到了由連串（strand）的三個動詞（、 和 ）構成的一個 叉子（fork）。叉子 f g h yf 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 5075 4 avg a NB 週期大小為 4 的移動平均 41 3875 3675 5125 7375 715 7425 66 60 5675 4225 5625 5125 3975 445 245 2775 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 3175 1525 2175 105 245 avg1 b NB 應用 avg 於 m 的每個秩為 1 的子陣列 198 29 216 126 一元副詞 插入（insert），接受位於它左側的一個運算元，併產生將這個動詞應用於其引數的每個專案之間的一個動詞。就是說， 是一個動詞，定義為應用 於給它的引數的各個專案之間。計算移動平均用到的二元副詞 中綴（infix），將作為資料引數的列表劃分成一系列的指定大小的連續專案的子列表，將所修飾動詞應用於其上，並將這些結果形成一個列表。 一元動詞相同（same），恆等於給它的單一右引數，常像這樣用來在賦值之後顯示變數的內容。一元動詞？擲骰 固定種子（rollfixed seed），不同於一元動詞？擲骰（roll），在生成資料引數專案所指定大小範圍內的隨機數之時，採用固定的種子。這裡確定對矩陣按行還是按列進行平均，用到了連詞 秩（rank），它在後面的定語章節和單獨條目中論述。 查詢與排序 二元動詞 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 yy f g y；副詞～反身被動，其一元定義為 f yy f y，二元定義為 x f yy 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 CSV 外掛 安裝用來支援 CSV 檔案的外掛 Addonstablescsv ： load pacman NB 載入包管理器 install jpkg tablescsv NB 安裝 CSV 檔案外掛 showinstalled jpkg NB 檢視已經安裝外掛 一個 CSV 檔案簡單用例： load tablescsv NB 載入 CSV 外掛 a i 2 3 a writecsv jpath test01csv NB 將一個陣列寫入一個 CSV 檔案 12 b readcsv jpath test01csv NB 從一個 CSV 檔案讀入一個盒子陣列 012 345 c makenum b NB 儘可能的將盒子陣列轉換成數值陣列 0 1 2 3 4 5 下面演示使用 J 語言編寫在管道中的過濾器，例如，在具有隱式程式設計機制 Unix 管道的 Linux 系統中，建立如下內容的文字檔案，並命名為比如 filter01ijs： usrbinijconsole load tablescsv stdout makecsv 10 makenum fixcsv stdin exit 然後在終端介面中執行如下命令列： cat test01csv ijconsole filter01ijs 101112 131415 資料型別 J 語言支援三種簡單型別： 數值 文字（字元） 盒裝 其中數值有很多變種。J 語言提供的唯一搜集（collection）型別，是任意維度的陣列。多數演算法可以使用這些陣列來簡潔的表達。 數值 J 語言的數值型別之一是 位。位有兩個值：0 和 1。位還可以形成列表，例如 1 0 1 0 1 1 0 0，是 8 個位的列表。在語法上，J 分析器將位當作一個字。空格字元被識別為字形成字元，它處在屬於其他數值字的字元之間。 J 語言支援任意長度的列表。J 語言進一步的在這些位列表之上，支援所有常見二元運算，比如動詞 與（and）、或（or）、非（not）、反轉旋轉（reverserotate）、f 移位（shift）等。J 語言還支援位的二維、三維等陣列。上面的運算同樣執行在這些陣列之上。 其他數值型別包括整數（比如 3、42）、浮點數（314、88e22）、複數（0j1、25j3e88）、擴充套件精度整數（12345678901234567890x）和（擴充套件精度）有理分數（1r2、3r4）。同位一樣，它們可以形成列表或任意維度的陣列。同位的情況一樣，運算可以在一個陣列的所有數值之上。下面例子展示 π 的前 50 位，超出了 IEEE 754 雙精度浮點數的 53 位二進位制尾數能精確表示的最大範圍，這就要用到 J 語言的擴充套件精度整數： 0j15 o 1 NB π 在雙精度浮點數下精確值的位數 3141592653589793 o 10x 50 NB π 乘以擴充套件精度 10 的 50 次冪 314159265358979323846264338327950288419716939937510 這裡採用一元動詞 oπ 乘以（pi times），和一元動詞 下取整（floor）二者的複合，得到預期的結果。位的列表可以使用一元動詞 基數 2（base 2）解碼成整數。整數可以使用一元動詞 反基數 2（antibase 2）編碼為位的列表。 文字 J 語言還支援文字即字元型別。文字包圍在撇號 之間，比如 a 或 b。文字的列表，透過將多個字元用撇號包圍起來的常規字串約定來表示，比如 abcdefg。在字串內的 表示 字元本身。單個的文字，典型的是 8 位寬即單位元組的 ASCII 字元，此外 J 語言還支援 Unicode 文字。 不支援在文字上的數值和布林運算，但支援面向蒐集的運算，比如旋轉等。使用動詞 執行數值（donumbers），將位元組陣列轉換成數值；使用動詞預設格式格式（default formatformat），將數值轉換成位元組陣列。 盒裝 盒裝型別的值是 0 維標量，而不管所包含的是怎樣的資料結構。使用一元動詞 盒裝（box），將資料放置入盒子中；使用一元動詞 開啟（open），開啟盒子中取出其中資料。還可以透過二元動詞；連結（link）建立盒子的列表，透過一元動詞；拆除（raze）移除一層盒子的列表。盒子內可以裝入其他盒子，還可以透過二元動詞 重製形狀（reshape）和二元動詞 計件複製（copy）等操作盒子及其列表。 陣列 J 語言的陣列，具有同質（homogeneous）的專案型別，例如列表 1 2 3 是整數的列表，儘管 1 還可以是一個位。這種型別問題，在極大程度上對於程式設計者是透明的。只有特定的特殊運算，會顯露出在型別上的不同。例如列表 10 00 10 00，對大多數運算，將被當作是完全同於列表 1 0 1 0。 J 語言支援數值稀疏陣列，透過它們的下標儲存非零數值。這在非零數值相對很少的情況下，是有效率的機制。 其他 J 語言還支援類和物件，但是它們並非資料型別，實際上使用盒裝文字來提及類和物件，它們實為命名語境和編號語境。 此外還有一個偽型別即記憶體對映檔案，它將變數對映到檔案系統中的持久檔案 code 記憶體對映檔案 。 簡要詞彙表 下面的表格簡要列出了常用詞彙。如果含義中用了間隔號分隔，通常前者是隻有一個右側引數的一元含義，後者是左右兩側都有引數的二元含義。列出的對應 APL 符號，是 Dyalog 等現代 APL 所採用的符號。 基本 J 詞彙 APL 符號 詞類 秩 含義 例子 動詞 0 0 （二元）等於（equal） 3 i 5 動詞 0 0 （二元）小於（lesser） 8 7 8 9 動詞 _ （一元）盒裝（box） i 2 3 i 3 2 動詞 0 0 （二元）大於（greater） 8 7 8 9 動詞 0 （一元）開啟（open） i 2 3 i 3 2 動詞 0 0 （二元）小於等於（less or equal） 8 7 8 9 動詞 0 0 （二元）大於等於（larger or equal） 8 7 8 9 動詞 _ （一元）唯一值（nub） abracadabra 動詞 _ （一元）唯一值篩選（nub sieve） abracadabra 動詞 0 0 （二元）不等於（notequal） 3 i 5 L 動詞 _ （一元）最大盒裝層數（level of） L 123 動詞 _ _ （二元）匹配（match） no yes e 動詞 _ _ （二元）成員關係（memberin） a e alpha E 動詞 _ _ （二元）尋找匹配子陣列起點（find match） co E cocoa 數學 J 詞彙 APL 符號 詞類 秩 含義 例子 動詞 0 0 0 共軛複數（conjugate）加（plus） 2 3 30 動詞 0 （一元）實部 虛部（realimaginary） 3j5 動詞 0 0 （二元）最大公約 或（GCDor） 0 0 1 1 0 1 0 1 動詞 0 （一元）雙倍（double） 7 動詞 0 0 （二元）或非（notor） 0 0 1 1 0 1 0 1 動詞 0 0 0 符號函式（signum）乘（times） 3 30 2 動詞 0 （一元）模長 幅角（lengthangle） 3j4 動詞 0 0 （二元）最小公倍 與（LCMand） 0 0 1 1 0 1 0 1 動詞 0 （一元）平方（square） 7 動詞 0 0 （二元）與非（notand） 0 0 1 1 0 1 0 1 動詞 0 0 0 相反數（negate）減（subtract） 1 10 5 6 動詞 0 _ _ 非（not）差（less） 0 1 動詞 0 （一元）一半（halve） ：7 動詞 0 0 0 倒數（reciprocal）除（divide） 2 3 5 3 4 6 動詞 0 0 0 平方根（square root）方根（root） 49 colspan2 動詞 0 0 0 幅值（magnitude）餘數（residue） i 7 動詞 0 0 0 下取整（floor）極小（minimum） 2 3 4 9 1 2 動詞 0 0 0 上取整（ceiling）極大（maximum） 11 05 19 動詞 0 （一元）減少（decrement） 7 8 9 動詞 0 （一元）增加（increment） 7 8 9 動詞 0 0 0 指數（exponential）冪（power） 2 i 17 動詞 0 0 0 自然對數（natural log）對數（log） 2 10 4 100 o 動詞 0 0 0 pi 乘以（pi times）圓函式（circle function） sin 1o j 動詞 0 0 0 i 乘以（imaginary）形成複數（complex） 3 j 4 動詞 0 0 0 階乘（factorial）抽取（out of） 2 10 動詞 0 0 0 擲骰（roll）（deal） 3 10 動詞 1 1 1 基數 2（base 2）基數（base） _ 60 60 24 0 1 動詞 _ 1 0 反基數 2（antibase 2）反基數（antibase） 24 60 60 86401 連詞 2 （一元）行列式（determinant） i 3 3 連詞 _ _ （二元）矩陣積（matrix product） i 3 2 i 2 3 動詞 2 _ 2 逆矩陣（matrix inverse）矩陣除（matrix divide） 3 3 10 結構 J 詞彙 APL 符號 詞類 秩 含義 例子 動詞 _ 1 0 形狀（shape of）重製形狀（reshape） 2 2 4 1 2 11 22 動詞 _ _ _ 反轉（reverse）旋轉（rotate） 動詞 _ 1 _ 轉置（transpose）重排軸（rearrange axes） abc def 動詞 _ （一元）散開（ravel） i 2 3 4 動詞 _ _ （二元）附加（append） i 2 3 i 3 2 動詞 _ （一元）散開專案（ravel items） i 2 3 4 動詞 _ _ （二元）縫合（stitch） i 2 3 i 2 4 動詞 _ _ _ 專案化擴秩（itemize）疊加（laminate） i 2 3 i 3 2 動詞 _ _ _ 拆除（raze）連結（link） i 2 3 i 3 2 12 副詞 _ （一元）自有區間（self intervals） _1 a b c 12 副詞 1 _ （二元）區間（intervals） 1 0 1 0 0 1 abcde 3 副詞 2 _ （二元）子陣列鑲嵌（subarrays） 2 22 4 3 i 5 6 動詞 1 （一元）劃分單字（words） ab cde 選取 J 詞彙 APL 符號 詞類 秩 含義 例子 動詞 _ （一元）計數（tally） 1 2 3 動詞 1 _ （二元）計件複製（copy） 1 0 2 1 2 3 動詞 _ （一元）頭部（head） foot 動詞 1 _ （二元）採取（take） 3 foot 動詞 _ （一元）斷頭（behead） 1 2 3 4 動詞 1 _ （二元）捨棄（drop） 2 1 2 3 4 動詞 _ （一元）尾部（tail） foot 動詞 _ （一元）截短（curtail） 1 2 3 4 索引 J 詞彙 APL 符號 詞類 秩 含義 例子 i 動詞 1 _ _ 整數生成（integers）出現索引（index of） i 10 i 動詞 0 _ _ 階梯序列（steps）最後出現索引（index of last） abcd i c I 動詞 1 _ _ 真值位置索引（indices）區間索引（interval index） I 0 0 1 0 1 0 動詞 _ （一元）升序索引（grade up） 10 20 動詞 _ _ （二元）上升排序（sort up） 10 20 動詞 _ （一元）降序索引（grade down） 10 20 動詞 _ _ （二元）下降排序（sort down） 10 20 動詞 1 （一元）目錄彙編（catalogue） 0 1 2 3 4 5 6 動詞 0 _ （二元）出自（from） 2 4 abcde 運算元 J 詞彙 APL 符號 詞類 秩 含義 例子 副詞 _ _ （二元）形成表格（table） i 6 副詞 _ （一元）插入（insert） 2 1 10 100 副詞 _ _ （二元）中綴（infix） 3 abcdefg 副詞 _ （一元）（prefix） banana 副詞 _ _ _ 字尾（suffix）外綴（outfix） _1 1 2 3 4 副詞 _ （一元）斜對角（oblique） i 4 4 副詞 _ _ （二元）（key） 1 0 0 1 0 AbcDe 副詞 _ lu ru 返身（reflex）被動（passive） 1 2 3 連詞 秩（rank） 1 i 2 3 4 連詞 _ _ _ 在於（at） 連詞 mv lv rv 頂上（atop） 連詞 mv mv mv 合成（compose） 連詞 _ 0 _ 粘上（bond） 連詞 _ _ _ 並列（appose） 連詞 mv mv mv 對偶（dual） 連詞 _ _ _ 底下（under） 連詞 mv lv rv 議程（agenda） 連詞 連結動名詞（tie or gerund） 連詞 _ _ _ 喚起動名詞 （evoke gerund） 連詞 _ _ _ 動詞冪（power of verb） 60 5 12 連詞 mu lu ru 調整 定製（fitcustomize） _ i 6 連詞 0 0 0 外界（foreign） 系統函式 60 雜類 J 詞彙 APL 符號 詞類 秩 含義 例子 系詞 是（is），區域性作用域（local） loc 1 2 系詞 是（is），全域性作用域（global） a b 3 4 NB 系詞 註釋（comment） NB for comments 名詞 字串（character string） Hello World _ 名詞 負號（negative sign） 無窮（infinity） _3 3 空數值向量（empty numeric vector） 00 a 名詞 即盒裝空值（boxed empty） a 00 動詞 _ _ _ 相同（same）左引數（left） p 3 q 5 動詞 _ _ _ 相同（same）右引數（right） i0 3 4 5 動詞 遮帽（cap） 3 1 4 動詞 1 _ _ 執行（do）數值（numbers） 9999 56 NULL 動詞 _ 1 _ 預設格式（default format）格式（format） 10j2 6 控制 直接定義（direct definition） dist xy 連詞 定義（definition） add 0 xy 動詞 _ _ _ 自引用（selfreference） fact 1 定語 J 語言的能力，很大程度上來自它的 定語（modifier：修飾詞），這個範疇包括 副詞 和 連詞：這些符號接受名詞和動詞作為運算元（operand），並以指定方式應用這些運算元。定語都可以應用於任何動詞，包括使用者寫的動詞，使用者可以寫自己的定語。 J 語言的二元動詞有右結合性，或稱為儘量長右作用域，即它有儘可能多的右引數。定語即運算元有左結合性，或稱為儘量長左作用域，即它有儘可能多的左運算元。如果表示式中存在定語即運算元，首先應用這些定語，然後應用其生成的動詞。 副詞 一元副詞 插入（insert），副詞 字首中綴（prefixinfix），副詞 字尾外綴（suffixoutfix），和連詞；剪下（cut），指定引數的諸個規則或不規則子集，並在其上執行運算。在 J 語言實現中，、極小值 和極大值 運算，是典型的會對其進行速度最佳化的特殊組合。 副詞～反身被動（reflexpassive），其一元形式 f yy f y，將提供給動詞的右引數重複放置在左引數位置上；二元形式 x f yy f x，將提供給動詞的左右兩個引數對換位置。 秩 名詞的秩（rank）是排布其原子所依據的軸的數目，即它的形狀中專案的數目。動詞的秩是它能夠在其上直接運算的右（和左）名詞引數的最高秩，典型的表示為三個原子的一個列表：一元秩 二元左秩 二元右秩。對副詞和連詞標示的秩，是所形成的動詞的秩。 秩在特定動詞和特定名詞的上下文下，將名詞的諸維，劃分成字首諸維的序列，稱為框架（frame）；和字尾諸維的序列，稱為單元（cell）。秩採用連詞 秩 來操縱秩 ，對應於 APL 符號，它有三種形式：un 指定秩（assign），mn 常量動詞（constant），uv 和 mv 複製秩（copy），這裡的 u、v 表示動詞運算元，而 m、n 表示名詞運算元。正數動詞秩，指示單元諸維的數目，負數動詞秩，指示框架諸維的數目，_指示整體。 二元動詞的左右引數的框架經常是匹配的，就是說二者有相同的形狀，從而保證了它們有相同數目的單元。如果左右引數的框架不匹配，有三種可以運算的情況： 標量一致，如果指定了兩引數中某一側的框架為空，即秩為_，這一個整體單元被應用於另一側引數的所有單元。 字首一致，兩引數中有一側的短框架是另一側長框架的字首，短框架的每個單元，被應用於對應的長框架去掉字首餘下諸維形成的單元陣列的所有單元。 字尾一致，兩引數中有一側的短框架是另一側長框架的字尾，這時需要以兩側加上相同正數增量的方式指定秩，使原短框架側的框架為空，原短框架的諸維形成的這一個單元陣列，被應用於原長框架去掉字尾餘下諸維形成陣列的每個單元陣列。 複合連詞 連詞 在於（at）、頂上（atop）、並列（appose）、合成（compose），是四種複合（composition）。J 語言支援叫作 鉤子（hook）和 叉子（fork）的隱形連詞，二種隱形連詞和四種複合連詞，規定了如何將引數或將所飾動詞應用於引數的結果，提供給所飾動詞來進行應用的規則。下表列出它們的定義： 連詞 APL 符號 一元 二元 秩 鉤子 _ _ _ 叉子 _ _ _ _ _ _ mv lv rv 同於 而應棄用 _ _ _ 同於 而應棄用 mv mv mv 在上面表格中，mv 0 v b0，lv 1 v b0，rv 2 v b0，這裡的副詞 b0 給出動詞 v 的三個秩。在應用四種複合連詞形成新動詞的表示式中， 和 ，要對第一步運算的中間結果，按所在子表示式的秩或整個表示式的秩_進行彙集（assembly），並在有需要的情況下進行框架填充，然後在這個彙集成的框架內進行第二步運算；而 和 ，直接在第一步運算的框架內，對中間結果進行第二步運算；在整個表示式求值結束時，最終結果在有需要的情況下要進行整體填充。 在中，一元 u 直接在二元 v 所劃分的框架內進行自己的運算。在中， 將二元 v 的運算結果，彙集成 v 所指定的框架。在，二元 u 直接在一元 v 所劃分的兩個框架內進行自己的運算。在中， 將一元 v 的兩個運算結果，彙集成mv 所指定的框架。 下面例子展示四種複合的中間結果的單元差異： a i 2 3 1 2 3 4 5 6 b 01i 2 01 02 a b 11 21 31 42 52 62 a b 112131 425262 a b 1 2 301 02 4 5 6 a b NB 這裡的框架仍是 2 3 101 201 301 402 502 602 當連詞 的一個運算元是名詞的時候，表示 粘上（bond），它透過向二元動詞固定提供其一個引數的值而產生一個動詞： 連詞 APL 符號 秩 _ 0 _ 派生的動詞經常作為一元動詞使用，即或；如果作為二元動詞使用，即或，左引數表示應用這個派生動詞於右引數的次數。需要確保透過 定義的一元動詞，不出現在能夠取用左右兩個的引數的上下文中；如此定義的二元動詞，也不應該出現在只能取用一個右引數的上下文中。需要注意 mv、v 和 v 等的左引數的作用域，有時遇到其左側的複合連詞會產生並非預期的效果，經常需要將表示式整體加以圓括號包圍。 J 語言還提供連詞 底下（under）和 對偶（dual）。下面定義中的動詞冪 _1 表示逆運算： 連詞 APL 符號 定義 秩 _ _ _ mv mv mv 、 和 合稱為 緊密複合（close composition）。現代 APL 中另有 每個（each），f 相當於 J 語言中的 f 。例如： 1 2 01 02 11 22 1 2 01 02 1122 在 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）， 對應於符號 。 用例 下面的簡單例子是計算歐幾里得範數，和生成數位與維度座標一致的整數： d 1 11 1 13 4 1 1 0 1 1 1 3 4 0 norm 1 NB 它可加圓括號為 1 norm d 141421 173205 5 coor 10 i0 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 中採用的圓括號包圍，使得 處在整個表示式的最外層，從而形成了兩步驟運算；右側的第一步是圓括號包圍的子表示式，它的完全加圓括號（fullyparenthesized）形式為： i0；左側的第二步是 與複合到其上諸運算構成的子表示式，它的完全加圓括號形式為：10 。一元動詞 目錄彙編（catalogue），應用在盒裝列表的列表之上，是接受可變數目的變長引數的典型的動詞。 下面透過對圓括號包圍的子表示式加以變化，辨析秩連詞和複合連詞的特性。這裡的動詞，劃分開了給連詞或副詞的名詞運算元，和給所生成的動詞的名詞引數： a i0 2 3 4 NB 運算式可加圓括號為 i0 1 21 2 31 2 3 4 a i0 2 3 4 NB 運算式可加圓括號為 i0 1 a i0 2 3 4 NB 運算式可加圓括號為 i0 1 i0 2 3 4 NB 運算式可加圓括號為 i0 12 123 1234 i0 2 3 4 NB 運算式可加圓括號為 i0 1 2 0 0 1 2 3 0 1 2 3 4 下面的例子展示並聯電阻電路計算：frac 1R_mathrm total frac 1R_1 frac 1R_2 cdots frac 1R_n，它可以如下這樣表達： Rtotal Rtotal 10 5 15 272727 動詞冪 連詞 動詞冪（power of verb），有兩種形式： n，是運算元為名詞的 固定冪。 v，是運算元為動詞的 動態冪。 對於固定冪 u n，如果 x 缺席，u n y 在以 y 為運算物件的迭代中，將動詞 u 應用 n 次；如果 x 存在，x u n y 在以 y 為運算物件的迭代中，將動詞 xu 應用 n 次。如果 n 是陣列，則按每個原子專案都執行一次動詞冪，結果的框架為這個陣列的形狀；如果 n 是取值為 0 或 1 的變數，則形成布林值條件執行；如果 n 是_1，則進行 u 的逆運算；如果 n 是_，則意味著 收斂（converge），即反覆應用 u 直到結果不再變化。例如： 13 0 1 1 2 3 4 1 2 3 4 4 7 10 13 4 abc abc 13 _1 4 7 10 13 1 2 3 4 _ 1 025 3 25 NB 以巴比倫方法即一種牛頓法特例來計算平方根 05 173205 5 對於動態冪 u v，如果 x 缺席，u v y 在以 y 為運算物件的迭代中，將動詞 u 應用 v y 次；如果 x 存在，x u v y 在以 y 為運算物件的迭代中，將動詞 xu 應用 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 0251025 0 1 3 6 12 NB 對大於閾值 4 的列表專案在其超出部份上扣除 25 1 3 55 10 3 100 _ 0 2 3 100 NB 只要列表專案小於 100 就對它加上 3 101 102 100 用例 下面的例子用來辨析秩指定與框架劃分及彙集的性質，其中涉及的直接定義等內容可見於後面的定義章節： itemize x y0 _ NB 定義具有一元和二元兩種形式的專案化擴秩運算 itemize i3 0 1 20 1 20 1 2 itemize i3 31 31 1 3 2itemize i3 3 1 2itemize i3 3 1 3 1 3 _1itemize i3 3 3 _1itemize i3 3 00 1 300 _1itemize i3 111 3 1 1 00 0 00 0 1itemize i3 3 1 1 _2itemize i3 3 1 3 0itemize i3 3 1 1 3 _3itemize i3 3 1 1 3 動名詞 在 J 語言中，動名詞（gerund）是叫做 原子表示 的特殊盒子的一個列表，這種盒子可以像任何其他盒子一樣使用，並可以最終轉變回到要執行的動詞。關於動名詞的運算有： 連詞 連結動名詞（tie or gerund），建立動名詞。 連詞 喚起動名詞（evoke gerund），在加以運算元之後成為： 6，將動名詞轉變成動詞列車； 0，將轉變回來的這些動詞分別單獨應用，並將它們的結果收集入一個列表。 連詞 議程（agenda），m n 從動名詞 m 中，選擇出第 n 個原子表示，將它轉變回到動詞並執行它。 下面是動名詞簡單示例和考拉茲猜想示例： grd 2 NB 建立一個動名詞 grd NB 顯示原子表示，這裡的符號 0 標識名詞 02 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 13 2 NB 考拉茲猜想的算式 Collatz 0 1 2 3 4 5 6 7 4 1 10 2 16 3 22 Collatz1_01e6 1000 NB 取 1000 個在 1e6 內的隨機數測試考拉茲猜想 1 定義 J 語言支援使用者進行顯式定義 ，和 形式的 cite webtitleSystemReleaseNotesJ902urlhttpscodejsoftwarecomwikiSystemReleaseNotesJ902date14 May 2020quoteExplicit entities can be defined using direct definition The digraphs and are reserved for delimiters and text found between is taken to define a verbadverbconjunction 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 itaccessdate20220630archivedate20220703archiveurlhttpswebarchiveorgweb20220703015845httpscodejsoftwarecomwikiSystemReleaseNotesJ902deadurlno 。下面以五種複合作為顯式定義的例子： at conjunction define u v y u x v y atop conjunction def u at vv 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 v0 v b0 下面以矩陣乘法作為直接定義的例子，並順帶演示秩連詞的用法： a 1000 410 b a p a b matmul x uv1 _ y a matmul b p 1 inner x uv11 _ y a inner 0 b p 1 outer x uv_1 2 _ y a outer b p 1 revmul x iyuv_ 1 2 _ y a revmul 0 b p 1 APL 傳統上的將內積解釋為，J 語言的矩陣乘法要求寫為，不隱含的為左運算元 f 附加一元 。轉置也是有較大的運算，不同的有不同的參照區域性性。 matmul 透過 1 _ 將 uv 的右引數從向量擴充套件為一般陣列，它用於右引數為陣列的情況。在向量與向量列表二者諸項之間逐對的進行乘積累加運算，是 BLAS 的標準演算法。 inner 採用了兩向量之間的點積運算 uv1，它適宜直接用於右引數為陣列的情況。在右引數為行主序陣列之時，需要如例子程式碼這樣，對右引數陣列進行二元轉置 0，這裡的 0 指示將第一軸安排至最後位置而其他軸保持原序前移。這種基於點積的實現，通常需要進一步加以。 outer 可以看作 matmul 的變體，它首先對左引數陣列進行轉置，然後進行多組的向量與一般陣列之間二元的張量積運算 v_1，最後在各組結果的列表上進行 u 計算，每組運算之後參與其中的左右兩陣列的元素不會被其他組的運算再次訪問。 revmul 同 inner 一樣適宜直接用於右引數為列主序陣列的情況，但採用了同 matmul 類似的計算方法，它在乘法之前對左引數陣列和在乘法之後對結果要做轉置，matmul 與 revmul 的關係如同 mathrm ABmathsf T mathrm Bmathsf Tmathrm Amathsf T。matmul 一次性訪問左引數陣列，反覆多次訪問右引數陣列；revmul 一次性訪問右引數陣列，反覆多次訪問左引數陣列。 在隱式定義中，遞迴定義可以不透過名字引用自身，轉而使用動詞 自引用。例如遞迴的計算斐波那契數列： fibonacci 1 2 20 fibonacci i9 1 1 2 3 5 8 13 21 34 _9 到 9 是常量動詞。動詞 遮帽，用在連詞 u v 一元與二元定義 所應用的動詞位置上，即充任了一元動詞 u 或二元動詞 v，可分別在如下兩種情況下報錯：定義的是二元動詞，卻不適當的被用作一元動詞；或定義的是一元動詞，卻不適當被用作二元動詞。 在顯式定義和直接定義中，提供了類似其他過程語言的控制結構控制結構。這裡列出的是每個範疇內的代表性控制字： 範疇 控制結構 斷言觸發 assert 返結果退出 return 跳轉到標號 goto_lbl label_lbl 條件執行 if T do B else B1 end 情況執行 select T case T0 do B0 end 條件迴圈 while T do B end 逐項執行 for_ijk A do B end 終止迴圈 break 終止本次迭代 continue 嘗試執行捕獲異常 try B catch B1 end 丟擲異常 throw 索引 J 語言的索引機制採用二元 來自（from）動詞來完成，它的秩為 0 _，它有兩種形式，分別為左引數為索引陣列的主軸索引，和左引數為二層或一層盒裝結構的逐軸索引，二者分別對應 APL 中，方括號內為單個軸的主軸索引選取，和方括號內為；分隔的多個軸的逐軸索引選取。 主軸索引 索引陣列的每個專案指定對主軸的專案單元的一個選取，將它們的結果再匯合為一個陣列。負值索引表示從末尾往前記數。在 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 逐軸索引 逐軸選取可以形成子陣列，在現代 APL 中，它被表示為，故而也被稱為 扁方塊（squad：squish quad）索引（indexing）或就叫做 索引（index）函式。裝在二層盒裝結構中的，是對應諸軸的一層盒裝子結構的列表，其中每個一層盒裝子結構內都是數值列表，它對應在此軸內一個或多個專案選擇。預設全選使用名詞 a麼點（ace）指示，它是盒裝空列表 00。在尾部的連續多個預設全選不需要寫出。例如： i 3 4 0 1 2 3 4 5 6 7 8 9 10 11 1 2 i 3 4 4 5 6 7 8 9 10 11 1 20 2 3 i 3 4 4 6 7 8 10 11 a0 2 3 i 3 4 0 2 3 4 6 7 8 10 11 a0 2 3 0 2 3 它還支援一層盒裝結構，裝在其中的是數值列表，它的元素指示每軸選取一個專案，如果單選了所有軸，則指定一個原子專案。一層盒裝結構中的這個數值列表，等價於二層盒裝結構中一層盒裝的單一數值的列表。兩種索引形式可以結合使用，即可以將盒裝結構的陣列作為給 的左引數，它按這個陣列的形狀匯合多個逐軸選取的結果。例如： 1 2 i 3 4 6 0 02 21 1 i 3 4 0 10 5 0 02 21 1 0 02 21 1 例如 1 2a0 2 3 這樣的選取是合法的，將形狀不一致的選取結果匯合在一起，會導致結果值填充。 重排軸 重排軸也叫做二元轉置。APL 的二元轉置對軸次序的指定，類似於組合數學中置換的一行形式的柯西表示法 Table 39 shows the detailed definitions of transposition for a variety of cases classwikitable Case R Definition R1V V RV R1 2M M RM R2 1M M2 1 R IJM JI R1 1M M R IM II R1 2 3T T RT R1 3 2T T1 3 2 R IJKT IKJ R2 3 1T T3 1 2 R IJKT JKI R3 1 2T T2 3 1 R IJKT KIJ R1 1 2T T1 2T3 R IJT IIJ R1 2 1T T1 3T2 R IJT IJI R2 1 1T T2 3T1 R IJT JII R1 1 1T T R IT III styletextalign center colspan3 Table 39 TRANSPOSITION ，它被稱為 可能是 APL 程式設計者最後掌握的原始運算之一。J 語言的二元轉置對軸次序的指定，不涉及將多個軸對映到結果中的一個軸的情況，使用了普通的索引形式的置換向量 上面的 APL 轉置運算規定中，不將多個軸對映到結果中的一個軸的簡單示例，所對應的 J 語言程式碼： transpose x y 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 語言寫為 ，而恆等式 的推導過程相應如下： kija ikja jika kjia ki ja ： 兩次連續的二元轉置，可以變換成等價形式： ，即先將後者置換向量 p 對前者置換向量 q 進行置換，然後用結果的置換向量做一次二元轉置。 對二元轉置後的陣列，進行原子專案的選取，可以變換成等價形式： ，即先用置換向量 p 的逆置換向量 p，對選取向量 k 進行置換，然後用結果的選取向量來選取未轉置陣列。 下面是演示例子程式碼： a 1000 410 n a p n q n p p 1 p p i n 1 p q q p 1 p qa p q a 1 k p a k pa pk a 1 示例 帕斯卡三角 下面例子形成帕斯卡三角的二項式係數的直接定義，並順帶展示基本的矩陣與盒裝運算： pascal 0 0 y 10 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 0 pascal i 5 1 11 121 1331 14641 t pascal i 5 11 11 2 11 3 3 11 4 6 4 1 a0i a0 t 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 二項式係數也可以寫成隱式定義形式： pascal 0 0 10 簡易圖表 下面是基於二元副詞 形成表格（table），製作條形圖和散點圖的簡易圖表例子 barChartH u16b2584 i barChartH 3 1 4 1 5 9 2 6 5 barChartV u16b258c i barChartV 3 1 4 1 5 9 2 6 5 scatterChart u16b2588 i scatterChart 3 1 4 1 5 9 2 6 5 這裡用到的 Unicode 方塊元素字元也出現在 IBM PC 內碼表 437 之中。 這裡的 scatterChart 可以使用二元副詞修改（amend）來實現： scatterChart u16b2588 1 y 0 x 91 i 對角線選取 APL 的二元轉置，在多個軸對映到結果中的一個軸的情況下，將其依次安排到前導位置上並進行對角線選取 。下面基於一元動詞 I真值位置索引，定義進行對角線選取的動詞 diag，它的左引數是布林值列表，其中的真值 1 指示與其位置對應的軸，要依次安排在前導位置上並進行對角線選取，其他的假值 0 所對應的軸相對位置不變。 diag s I I t 1 i 1 xt xs y 這裡區域性定義了 s，它的左右引數同於給 diag 的引數，它生成二元轉置需要的置換向量，這是由要安排到前導位置上的那些軸的位置索引，和餘下其他軸的位置索引串接而成。這裡的 以右引數的諸軸數目選取左引數，用來在左引數的真值和假值的總數小於右引數的諸軸數目之時，對左引數填充上假值。 接著區域性定義了 t，它的左引數是給 diag 的布林值列表中真值 1 的個數，右引數是要對其指定數目的前導軸進行對角線選取的陣列，它生成對角線選取所需要的一層盒裝選取列表。這裡的 選取出要進行對角線選取的前導諸軸的最小長度，用 i 形成這個長度的整數數列，再用 1形成其長度為左引數的全為 1 的列表，透過 在二者之上形成表格矩陣。 最後的表示式先進行指定的二元轉置，再對其結果進行相應的對角線選取。下面是簡單用例： i 3 5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 1 diag i 3 5 1 7 13 i 2 3 2 0 1 2 3 4 5 6 7 8 9 10 11 1 1 diag i 2 3 2 0 1 8 9 0 2 1 i 2 3 2 0 2 4 1 3 5 6 8 10 7 9 11 1 0 1 diag i 2 3 2 0 2 4 7 9 11 快速排序 J 語言提供的排序機制基於了穩定排序演算法，下面的例子程式碼是快速排序的直接定義： cmp quicksort if 1 y do y return end s y u y y u quicksort s0ys0yu quicksort s0y 這裡定義一個動詞 cmp，它透過逐個做兩個數的差並取其符號，得到取值為_1、0 或 1 的平衡三進位制值。cmp 將作為左運算元傳遞給副詞 quicksort。 在 quicksort 的定義中，向區域性變數 s 賦值的表示式，第一步隨機選擇支點（pivot）運算，首先計算？y，生成在資料總個數範圍內的隨機數，接著在其上計算 ，選擇出在隨機數指定的位置上的支點值；它的第二步運算，將運算元 u，應用到其左引數的資料列表，和右引數的支點值二者之上。 隨後是串接分治運算結果，首先將平衡三進位制值列表，分別與 0 做逐項的三分法比較，得到三個布林值列表；然後以這種列表中的 0 和 1 作為件數，複製出資料列表的符合這個條件一個新的子列表，其中兩個作為引數傳遞給遞迴呼叫進行排序。 下面的快速排序實現，展示了隱式程式設計，即將函式複合在一起，而不顯式的引用任何變數，不提及要應用於其上的形式引數。這裡將前面程式碼中向區域性變數 s 賦值時所求值的表示式改為隱式定義，進而以作為鉤子的第一步運算的方式，代入引用這個變數的表示式之中，並且採用鉤子的引數複製機制消隱了形式引數 y： cmp quicksort 0 00 u 1 y cmp quicksort 2 0 4 7 15 9 8 0 4 9 18 8 1 18 0 0 1 2 4 4 7 8 8 9 9 15 18 18 提供給連詞 的左側運算元，外層是個一元鉤子，它將提供給它的單一右資料引數，重複放置在它的左資料引數位置上。這個外層一元鉤子的第一步運算，是生成平衡三進位制值列表的巢狀的二層一元鉤子 u ；而外層一元鉤子的第二步運算，將生成的三個子列表串接起來。生成三個子列表的表示式，以資料列表是作為左引數，以平衡三進位制值列表作為右引數；這裡的三個二元鉤子首先生成布林值列表，接著進行對換了左右引數位置的二元複製運算，最後它們中有兩個透過自引用 進行了遞迴呼叫。 這個定義中的 是在這個副詞的私有語境內呼叫的動詞，所以不像前面直接定義那樣需要加上運算元 u 以副詞形式來呼叫。這裡沒有對字串長度小於等於 1 的情況進行處理，這是因為迭代運算在條件不滿足時返回初始值，也就是返回這個字串本身。將 cmp 的表示式，代入定義中的左運算元 u，就能定義出動詞，同時也不再需要外在的採用直接定義的形式。 將一元鉤子替代為左分支為 的叉子，形成的動詞列車更具可讀性： quicksort 0 00 u 1 y 下面的例子定義基於一元 進行字串比較的 cmp： cmp alpha cmp beta _1 beta cmp alpha 1 beta cmp beta 0 t the heart has its reasons that the reason does not know words _1 t thehearthasitsreasonsthatthereasondoesnotknow cmp quicksort words doeshasheartitsknownotreasonreasonsthatthethe 在這個 cmp 定義中， 先將兩個字串引數進行盒裝串接，然後一元 給出二者的升序索引，二者之間為升序或相同時為 0 1，而二者為降序時為 1 0；至此是升序還是相同仍需區分， 判斷兩引數是否為 不相同，不相同時為 1，而相同時為 0。這裡的副詞；_1 自有區間，使用字串的第一個字元作為分隔符，對字串進行劃分並去除分隔符，然後應用所修飾的動詞於這些子字串之上。 全排列 下面的例子給出 n 個專案的所有置換的有次序的矩陣。首先定義名詞 p3，它是置換長度為 3 的全排列矩陣： p3 i A i 3 0 1 2 0 2 1 1 0 2 1 2 0 2 0 1 2 1 0 這裡用到了動詞：A易位詞（anagram），x A y 的左引數 x，指定了長度為 y 的所有置換中給特定一個置換的編號，其對應的置換向量在組合數學中被稱為逆序向量，據此編號置換 y 的專案。這裡求全排列的數目，用到了一元動詞！階乘。接著在 p3 的基礎上，實現置換長度為 4 的全排列矩陣： i 4 NB 生成 44 單位矩陣 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 i 4 NB 生成第 1 列為 0 1 2 3，每行後 3 個元素升序的 44 奇妙 矩陣 0 1 2 3 1 0 2 3 2 0 1 3 3 0 1 2 0 1 p3 NB 對 3 元素全排列的每個元素增 1，並在每個排列頭部添 0 0 1 2 3 0 1 3 2 0 2 1 3 0 2 3 1 0 3 1 2 0 3 2 1 perm0 01 p3 _ 1 1i _1 perm0 4 0 1 2 31 0 2 32 0 1 33 0 1 2 0 1 3 21 0 3 22 0 3 13 0 2 1 0 2 1 31 2 0 32 1 0 33 1 0 2 0 2 3 11 2 3 02 1 3 03 1 2 0 0 3 1 21 3 0 22 3 0 13 2 0 1 0 3 2 11 3 2 02 3 1 03 2 1 0 perm0 4 4 6 4 這裡的 _ 1，其左側是從 63 全排列矩陣加工而成 64 選取矩陣，用它分別對其右側的 44 奇妙 矩陣的每一行進行主軸索引運算，即將選取矩陣每行第 1 個元素保持為 奇妙 矩陣此行的第 1 個元素，而每行後面 3 個元素是對 奇妙 矩陣此行後面 3 個元素的排列。這一步寫出的排列動詞的結果是 464 的三維陣列，將它重製形狀為 244 全排列矩陣： perm1 01 p3 _ 1 1i p4 perm1 4 24 4 二元動詞 的左引數的值為 y y，這裡的 y 是給排列動詞的資料引數；而它的右引數是用一元動詞，將三維陣列散開後形成的一個向量。 然後將其中的 p3，替代為遞迴的自引用 1；並透過名詞秩，形成常量動詞 1 00_，設定長度為 0 時的基礎值為 1 00： perm 1 00_ 011 _ 1 1i 0 perm 4 p4 1 perm 0 1 0 perm 1 1 1 invertVec I 1 perm perm 1 _1 invertVec 4 0 1 3 2 3 2 1 0 invertVec 3 2 1 0 23 最後將遞迴形式改為迭代形式，可採用連詞 F單結果正向摺疊（fold single forward），使用它需要事先安裝外掛 devfold。這個連詞所形成的動詞，從左至右遍歷右引數列表，將其專案逐個作為動詞運算元所見到的左引數；它的左引數是迭代物件的初始值，動詞運算元所見到的右引數是迭代物件： load devfoldfoldr perm 1 00 F 01 _ 1 1ii 如果不採用連詞 F，可以基於一元副詞 插入，自行實現正向摺疊運算元： foldl m_ vm_1 0 perm 1 00 foldl 01 _ 1 1ii 生命遊戲 在 J 語言中，提供了二元副詞；3 子陣列（subarrays），它是；剪下（cut）的三種形式之一，也被稱為密鋪（tessellate）或鑲嵌（tile）。x u_3 y 應用動詞 u 於由 x 指定的 y 的有相同形狀的每個正規鑲嵌之上。3 與之類似，但不丟棄結果中不完整的鑲嵌。 現代 APL 所使用的二元運算元（stencil），在邊緣的處理上不同於 J 語言的鑲嵌，它要求鑲嵌子陣列每個軸的中心，在長度為奇數時是 y 的元素，在長度為偶數時在其元素之間，並且用填充（fill）元素填滿超出的部份，它的預設移動步長是 1。下面在；_3 的基礎上，利於二元動詞 採取（take）的填充特性，定義一個 stencil 實現： stencil p 11 n r p t rs ry p u_3 ts y 這個定義只提供一個右名詞運算元 n，它是鑲嵌子陣列的規定矩陣，不提供同每個子陣列對應的諸軸填充數目作為左名詞運算，APL運算元提供它，意圖在需要時籍此移除填充。這裡的鑲嵌規定矩陣定義，其第 1 行是子陣列的每軸長度，第 2 行是每軸的移動步長，這個行次序與；3 的規定相反。這裡的 p 是給；_3 的鑲嵌規定矩陣，r 是每軸在頭部和尾部的填充數量，s 是正值控制尾部填充，t 是負值控制頭部填充。在下面的簡單用例中，數值陣列的填充元素是 0： d 4 4 i 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 stencil 2 3 d 0 1 21 2 32 3 43 4 0 0 5 65 6 76 7 87 8 0 0 5 65 6 76 7 87 8 0 0 9 19 1 21 2 32 3 0 0 9 19 1 21 2 32 3 0 0 4 54 5 65 6 76 7 0 下面實現康威生命遊戲，它是基於的一種細胞自動機 life 3sy4s stencil 3 3 y glider _2 noun define 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 life glider 0 1 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 u16b2596 i8 life x y glider 這裡的實現演算法，將生命遊戲規則合併入一個單一表達式中，它由 Arthur Whitney 提出。演算法的第一步驟用 合計每個格點及其周圍格點中 1 數目，並將它區域性儲存在 s 中。第二步驟將為前面的結果與 4 做相等比較，再與當前狀態 y 做邏輯與運算，只有在當前格點為 1，而且周圍格點合計為 3 的情況下，當前格點得到真值 1。第三步驟用 s 減去前面的結果真值，再與 3 做相等比較。在這個最終結果中，當前格點得到真值 1 有兩類情況：⑴它在 s 中的值為 4，並減去了真值 1，這就是第二步驟運算所選定的情況；⑵它在 s 中的值為 3，並減去第二步驟運算在這種情況下必然得出的假值 0，這又可細分為兩種情況：當前格點為 0，而且周圍格點合計為 3；或者當前格點為 1，而且周圍格點合計為 2。 這個演算法可以寫為隱式定義形式： life 3 4 stencil 3 3 在 J 語言中，實現以遞推關係定義的序列，避免出現 O n2 的時間複雜度，可以採用連詞 F多結果正向摺疊（fold multiple forward），使用它需要事先安裝外掛 devfold。這個連詞所形成的動詞，不輸出左引數的初始值，如果提供的右引數為空值，它的輸出為空值，否則它輸出每次迭代的結果。上例中的迭代算式可以改寫為： load devfoldfoldr u16b2588 Flife70 glider 如果不採用連詞 F，可以自行實現輸出中間結果的正向摺疊運算元： foldlist if 1 y do return end r a x for_i y do r r u a i v a end r u16b2588 foldlist life70 glider 在這裡的 foldlist 中，將 r a x 改為 r u a x，則 foldlist life70 可改為 foldlist life70。 鍵分組 在 J 語言中，提供了二元副詞 鍵分組（key），它按左引數中的唯一鍵，對右引數進行分組（group）或稱為分割槽（partition），並將所修飾動詞應用到這些分組之上。分組次序同於一元動詞～唯一值 處理結果的次序，它除去匹配前面出現過的專案的任何專案。下面在它的基礎之上，定義對應現代 APL 使用的二元運算元鍵分組（key）的一個副詞，它將所修飾動詞應用在唯一鍵和相應的分組二者之上，它還具有一元和二元兩種形式： key 0 y u y iy 0 x u x y 它的二元形式的左引數含有唯一鍵，而右引數是要分組的資料；它的一元形式的右引數含有唯一鍵，所分組的是右引數諸專案的索引值。下面是這個鍵分組副詞所適用的動詞的簡單示例： x Mississippi key x Misp key x 01 4 7 102 3 5 68 9 key x M0 i1 4 7 10 s2 3 5 6 p8 9 key x M1 i4 s4 p2 下面的例子透過鍵分組來找到一個單詞列表中的易位詞： a _1 pats spat teas sate taps etas past seat eats tase star east seta patsspatteassatetapsetaspastseateatstasestareastseta a apstapstaestaestapstaestapstaestaestaestarstaestaest key a patsspattapspastteassateetasseateatstaseeastsetastar 隨機數 在 J 語言中，提供了二元動詞 I區間索引，它左引數 x 必須是有次序的，從而定義了 1x 個區間，除了最後一個之外的每個區間，都含有並結束於 x 的一個專案，而最後一個結束於正無窮，第一個開始於負無窮；它應用於右引數 y，給出 y 所位於的區間的索引。 下面的例子產生符合指定離散機率分佈的隨機數列表，這裡定義了動詞 ran，它依據左引數 x 給出的正實數向量中的這些權重，從 ix 中選取出由右引數 y 指定個數的隨機數列表： ran I 0 wt 7 5 6 4 7 2 04 t wt ran 1e6 1000000 10 t 0 1 1 5 0 1 3 4 4 0 r wt i t NB 實測的出現比率 0222618 0159083 019152 0127394 0222795 006378 001281 p wt NB 期望的出現機率 022293 0159236 0191083 0127389 022293 00636943 00127389 0j6 r p _0000312 _0000153 0000437 0000005 _0000135 0000086 0000071 這裡首先透過？0，生成指定數目的在區間 01 中的隨機浮點數，它也可以寫為等價的？ 0。然後在叉子 中，使用一元副詞 字首 修飾動詞 ，從而計算權重向量的，再用字首和除以總和得出累積分佈函式。最後透過區間索引，在有隨機浮點數落入特定區間的時候，生成這個區間對應的隨機整數。 動詞 ran 的表示式是個二層二元鉤子，外層鉤子的第一步運算應用到右引數上，它的第二步運算即內層鉤子，整體修飾了二元副詞～被動 而對換了兩個引數的位置。內層鉤子的第一步運算 所應用的右引數實際上是外層鉤子的左引數，它的第二步運算 I 修飾了～，從而將它所面對的內層鉤子的左右兩引數，再次對換回到外層鉤子即整體表達式原先的位置上。 下面是將區間索引和鍵分組結合起來的例子，演示了－萊維中心極限定理 histogram u16b258c ix x y summary l 0 r 1 1 ix lixx rlI y sampleMean m m vm y 24histogram 80summary 10 sampleMean 0 1e6 lineChart s ix x t 0 2 21 1 1 u16b2588 20 t s y 24lineChart 80summary 10 sampleMean 0 1e6 這裡定義的 summary 區域性賦值了兩個區域性變數 l 和 r，可以將這兩個區域性賦值去掉，並將這兩個區域性變數的出現替代為運算元 m 和 n，如此對它的呼叫將變成 800 summary 1 這樣的形式。接下的程式碼結合前面兩個例子，採用了不同於上例連續型均勻分佈的其他分佈作為獨立同分布，和不同的： ratio 1 i 10histogram wtratio wtran 1e6 random 0 I 0 20lineChart 80summary wtrandom 1e6 20lineChart 80summary 2 sampleMean wtrandom 1e6 20lineChart 80summary 4 sampleMean wtrandom 1e6 SQLite 外掛 操縱 SQLite 資料庫的需要安裝相應外掛： load pacman NB 載入包管理器 install jpkg datasqlite NB 安裝 SQLite 資料庫外掛 load datasqlite NB 載入 SQLite 資料庫外掛 getbin_psqlite_ NB 安裝 SQLite 資料庫的共享庫 SQLite 資料庫的簡單用例： load datasqlite NB 載入 SQLite 資料庫外掛 db sqlopen_psqlite_ addonsdatasqlitedbsandpdb NB 開啟樣例資料庫檔案 sqltables__db NB 檢視所有表格名字 pssp sqlmeta__dbs NB 查看錶格 s 的結構 cidname typenotnulldflt_valuepk 0 sid text0 NULL 1 1 name text0 NULL 0 2 statusint 0 NULL 0 3 city text0 NULL 0 ds sqlread__dbselect from s NB 讀取表格 s，結果表格形狀扁長不適合直接展示 dict NB 以字典方式顯示錶格資料 rs dict ds sid s1s2s3s4s5 name smithjonesblakeclarkadams status20 10 30 20 30 city londonparisparislondonathens rs sqldict__dbs 1 cols NB 表格資料的諸列列表 cs cols ds cs sqlexec__dbs 1 s_ ds cs NB 將表格的諸列並行賦值給添加了表名字首的諸列名 s_status 20 10 30 20 30 s_sid s1s2s3s4s5 ds sqlcols__dbs 1 reads NB 格式化顯示錶格資料 rs reads ds sidname statuscity s1 smith20 london s2 jones10 paris s3 blake30 paris s4 clark20 london s5 adams30 athens 2 rs NB 第 3 列資料的形狀 5 1 rs sqlreads__dbs 1 readm NB 以矩陣顯示錶格資料 rs readm ds sidnamestatuscitys1smith20london s2jones10paris s3blake30paris s4clark20london s5adams30athens rs sqlreadm__dbs 1 cp addonsdatasqlitedbsandpdb test_sandpdb db sqlcopy_psqlite_ cp NB 複製資料庫並打開復本 cls sqlcols__dbs NB 得到表格 s 的列名列表 dat s6s7 browneaton 40 10 romemadrid sqlinsert__dbs cls dat NB 將資料插入表格 s 0 3 sqltail__dbs NB 返回最後 3 個格式化記錄 sidname statuscity s5 adams30 athens s6 brown40 rome s7 eaton10 madrid sqlclose__db NB 關閉資料庫 1 字典類 J 語言採用命名語境實現類，採用編號語境實現物件，下面示例建立字典類： cocurrent Dict create o DEFAULT__o 00 o conew Dict get ITEM_y set ITEM_y DEFAULT ITEM_y x del erase ITEM_y pop r del y r get y default DEFAULT y filt IITEM_E len filt namelist 0 list 5 filt namelist 0 in y list clear erase filt namelist 0 copy o conew Dict o __o55 DEFAULTfilt namelist 0 destroy codestroy cocurrent base 在家目錄中建立一個 dictijs 檔案並錄入上述程式碼，接著以如下程式碼建立字典物件並對其進行檢視和簡單操作： load dictijs conl 0 NB 檢視命名語境 Dictbasejjcomparejregexjtaskz namelist_Dict_ 3 NB 檢視 Dict 類的動詞 clearcopycreatedefaultdeldestroyfiltgetinlenlistpopset d create_Dict_ d NB 變數儲存的是盒裝字串 0 namelist__d 0 NB 檢視 d 物件的名詞 COCREATORDEFAULT conl 1 NB 檢視編號語境 0 copath 0 NB 檢視編號語境的查詢路徑 Dictz set__d i1 2 3 set__d i2 2 3 abc set__d i3 abc len__d 3 list__d i1i2i3 e copy__d get__d i2 2 3 del__d i2 1 in__d i3 1 pop__d i3 abc clear__d 1 list__e i1i2i3 參見 秩 J 程式語言 引用 外部連結 JSoftware，J 的官方網站 Repository Learning J An Introduction to the J Programming Language by Roger Stokes J for C Programmers by Henry Rich J for the APL Programmer by Chris Burke and Roger Hui An Implementation of J by Roger KW Hui APL to J Phrasebook J － APL Wiki 郭平欣譯 J 字典 CategoryAPL 程式語言家族 Category 陣列程式語言 Category 動態型別程式語言 Category 函數語言程式設計語言 Category 函式級語言 Category 面向物件的程式語言 Category 基於類的程式語言