J語言
J語言,是一種陣列編程語言,由肯尼斯 ・ 艾佛森佮許國華佇一九九空年代初發明。J 語言就是 APL 語言的一種方言,延續矣 APL 鮮明的彼个簡潔性,𪜶佇咧數學佮統計學程式設計頂懸會有足濟效,特別是需要進行矩陣運算的場合。
J 語言上代先開始肯尼斯 ・ 艾佛森佇一九八七年發表的《APL 字典》,伊實現了其中到關重要的秩的概念。J 語言提供隱式定義機制包括秩、勾點、攕仔佮濟種函式複合,並且介入了做頭等等的物件的動名詞,用建立控制結構,伊定定予人做為隱式編程的典範之一。
簡介
J 語言的運算子,承襲 APL 傳統,無優先級並且上右先行,` 二 * 三 + 四 ` 照起來 ` 二 * ( 三 + 四 ) ` 來運算。以歷史上 APL 使用的典型符號做例,符號 ` / ` 被用來指示拗疊式 ` foldr 一 `,所以乎 ` + / 一二三 ` 等價於 ` 一 + ( 二 + 三 ) `;佇咧 APL 中,除法被表示做數學除號 ` ÷ `,伊將減號佮冒號做伙重複列印佇咧 EBCDIC 和 ASCII 二者的紙質文字終其尾;J 語言使用 ` % ` 表示除法,是對除號的一種近似抑是提示。
為著避免 APL 使用特殊的字元而拄著的問題,J 語言只需要基本的 ASCII 字元集,但使用點號 ` . ` 佮冒號 ` : ` 做為「屈折」。 點號佮冒號除了前導著空白字元的情況以外,攏放予絚前字元形成類似雙字元組的短字。多數「基礎」抑是「原始」的 J 單字,攏充當數學符號,通過點號抑是冒號來擴充遮的可用基本字元的含義。佇咧其他的語言內底定定是成對的足濟字元,比如講 ` [ ] { } " " ` ` < > `,佇咧 J 語言當做單獨的字,抑是講佇咧有屈折的時陣,作為多字元字的單字元字根。
J 語言袂閣支援對一九六八年的 APL \ 三百六十就有的 ` [;] ` 形式的方括號索引,轉來支援叫做「來自」(from)的索引機制,伊起源自 Kenneth E . Iverson 佇一九七八年佇咧《算子佮函式》中提出的,依據基數解碼定義,閣用符號 ` ⌷ ` 表示的索引。
J 語言承襲 IBM APL \ 三百六十採用平坦時列模型,無支援由 NARS(岫狀陣列研究系統)佇一九八一年介入,並予人 IBM APL 二所採納的岫狀陣列模型;J 語言增加了 Kenneth E . Iverson 佇一九七八年佇咧《算子佮函式》內底提出的盒仔裝資料類型,伊由 SHARP APL 佇一九八一年介入,並且一九八三年佇咧 I . P . Sharp 協會研究報告《理性化 APL》中,列入佮 APL 二相較的「限定子集」(RS)顛倒重強調。
J 語言支援 AVX 二指令集進行 SIMD 運算。為著包裝用物件導向程式設計語言開發的 API 佮框殼,J 語言提供層級的號名空間機制,遮所有的名攏佇咧特定語境(locale)中,會當避免軟體套件之間的名衝突,並會當有效的用作類別為基的物件導向程式設計的框殼。
J 語言直譯器預設裝載標準庫。通過包管理器,會當安裝各種外掛程式。J 語言有定定規除錯機制,猶閣有叫做 Dissect 的會當看著器啦。除了科學計算和統計分析,伊閣予人用佇關聯式資料庫管理系統如 Jd、盡磅編程佮網路效能分析。
二空一一年三月,J 語言採用矣 GNU 通用公共許可證版本三,從而成做自由佮開源軟體,人猶閣會當踮 Jsoftware 的商業許可證下利用原始碼。
文件佮詞類
J 語言的文件包括佇官網的 NuVoc 中,佇咧其中將主要的字羅列做「J 原語」,並使用色水標示出𪜶分別的詞類。古早的文件猶閣入門佮字典。佇咧 J 語言中的字,予人辨識做名詞、動詞、定語(副詞佮連詞)、 系詞、標點、控制字。一个程式抑是常式,若是接受資料做輸入並產生資料做輸出,是予人叫做「動詞」,佮之相對,資料參數予人叫做是「名詞」。
動詞有兩个形式:干焦正爿一个參數的一箍(monad)形式,佮有倒爿兩爿參數的字元(dyad)形式,譬如講佇 ` 影一 ` 中減號是一箍動詞,啊若佇咧 ` 三孵二 ` 中減號是二箍動詞。J 語言定義誠豐富的動詞,𪜶攏自動的作用佇濟種資料類型之上。使用者定義的程式會使家己號名,並用佇任何允准使用原始動詞的所在。無論講原始動詞抑是衍生動詞,𪜶的一箍定義佮二元定義,佇足大程度上是獨立的。
起步範例
J 語言會當寫出非常的精簡的程式,特別是存在重度的對符號的函式多載,以至於一寡編程者共伊叫做真歹閱讀的唯寫語言。佇咧電腦的終端上執行 ` ijconsole `,就會當進入 J 語言的 REPL 直譯器介面。
Hello , World !
J 語言的「Hello , World !」程式:
這乎 Hello World 的實現反映著 J 語言的傳統用法,就是共程式錄入到 J 直譯器對談中,顯示出表達式結果。閣會當準備 J 指令碼來做獨立程式來執行,比如講佇 Linux 系統上,會當編輯若下內容的一个文字檔案,並號名做比如講 ` test 一 . ijs `:
注意第一途的 ` # ! ` 著愛頂頭,遮的 ` echo ` 和 ` exit `,是佮 Unix shell 中同名號令功能類似的動詞。然後佇終端介面中執行這个檔案:
平均
佇咧 J 咱語言中和函式一般號做動詞,譬如講定義一个叫做 ` avg ` 的動詞,計算一序列數的平均:
一箍動詞 ` # `「計數」(tally), 總計陣列中專案的總個數。動詞 ` + `「加」(plus)佮副詞 ` / `「插入去」(insert), 衍生出的動詞 ` + / `,合計這个陣列的專案的總和。二箍動詞 ` % `「除」(divide)將這个總和除以這个總個數。使用者定義的動詞 ` avg `,用著矣由連攕(strand)的三个動詞(` + / `、` % ` 和 ` # `)構成的一个「攕仔」(fork)。 攕仔 ` ( f g h ) y ` ↔ ` ( f y ) g ( h y ) `,遮的 ` f `、` g ` 和 ` h ` 指示動詞,而且 ` y ` 指示一个名詞。
使用 ` avg ` 的一寡例:
一箍副詞 ` / `「插入去」(insert), 佇接受著位佇伊的倒爿運算元,並產生將這个動詞應用佇其參數的每一个案之間的一个動詞。就是講乎,` + / ` 是一个動詞,定義來應用 ` + ` 所予伊的參數的各個案之間。計算徙動平均用著的二元副詞 ` \ `「著妝娗」(infix), 欲做資料參數的列表分做一系列的指定大細的連紲專案的子列表,將所修削的動詞應用佇其上,並將遮的結果形成一个列表。
一箍動詞 ` ] `「相仝」(same), 恆等於予伊的單一正參數,定像按呢用來佇咧賦值了後顯示變數的內容。一箍動詞 ` ? . `「撚骰仔 / 固定種子」(roll / fixed seed), 無仝一箍的動詞 ` ? `「撚骰仔」(roll), 在生成資料參數專案所指定大細範圍內的亂數之時,採用固定的種子。遮有影著矩陣照起行猶是照列進行平均,用甲連詞 ` " `「秩」(rank), 伊佇後壁的定語章節和單獨條目中論述。
走揣佮排序
二箍動詞 ` i . `「出現索引」(index of), 佮兩箍動詞 ` i : `「最後出現索引」(index of last), 佇任何大細的陣列內底揣匹配者,閣倒轉來伊的位索引,若無揣著匹配者,則轉去這陣列的大細。比如講:
佇咧 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)。 下跤是用例:
CSV 掛程式
佇管理員權限下跤,安裝來支援 CSV 檔案的外掛程式:
一个 CSV 檔案簡單用例:
下跤演示使用 J 語言編寫佇管道中的過濾器,比如講,在具有隱式編程機制 Unix 管道的 Linux 系統當中,建立如下內容的文字檔案,並號名做比如講 ` filter 一 . ijs `:
然後佇終端介面中執行如下命令列:
資料類型
J 語言支援三種簡單類型:
- 數值
- 文字(字元)
- 盒仔裝其中數值真濟變種。J 語言提供的唯一搜集(collection)類型,是任意維度的陣列。多數的演算法會當來使用遮的陣列來簡潔的表達。
數值
J 語言的數值類型之一是「位」。 位有兩个值:` 零 ` 和 ` 一 `。位閣會當形成列表,比如講 ` 一零一零一一零零 `,是八个位的列表。佇咧語法頂懸,J 分析器共位當做一字。空格字元被辨識做字形做字元,伊處佇咧其他數值字的字元之間。
J 語言支援任意長度的列表。J 語言一步佇咧遮的位列表之上,支援所有定定見二元運算,比如講動詞 ` * . `「佮」(and)、 ` + . `「抑是」(or)、 `-. `「非」(not)、 ` | . `「反轉 ・ 旋轉」(reverse ・ rotate)、 ` | . ! . f `「徙位」(shift)等。J 語言閣支援位的二維、三維等陣列。頂懸的運算仝款執行佇遮的陣列頂懸。
其他數值類型包括整數(比如講三、四十二)、 浮點數(三孵一四、八堵八 e 二十二)、 複數(零 j 一、二嬸五 j 三 e 八十八)、 擴充精度的整數(12345678901234567890x)和(擴充精度)有理分數(一 r 二、三 r 四)。 仝位仝款,𪜶會當形成列表抑是任意維度的陣列。仝位的狀況仝款,運算會當佇一个陣列的所有的數值之上。下跤例展示 π 的前五十位,超出矣 IEEE 七百五十四雙精度浮點數的五十三位二進位尾數能精確表示的上大範圍,這就愛用著 J 語言的擴充精度整數:
遮採用一箍動詞 ` o . `「π 乘以」(pi times), 佮一箍動詞 ` < . `「硩規下」(floor)二者的複合,得著預期的結果。位的列表會當使用一箍動詞 ` # . `「基數二」(base 二)解碼成整數。整數會當使用一箍動詞 ` # : `「反基數二」(antibase 二)編碼為位的列表。
文字
J 語言閣支援文字即字元類型。文字包圍佇咧撇號 `'` 之間,比如講 `'a'` 抑是 `'b'`。文字的列表,通過將濟的字元用撇號包圍起來的定規字串約定來表示,比如講 `'abcdefg'`。佇字攕內的 `` 表示 `'` 字元本身。單一个的文字,典型的是 ` 八 ` 位闊即單位元組的 ASCII 字元,此外 J 語言閣支援 Unicode 文字。
無支援佇文字頂懸的數值佮布林運算,毋過支援面向搜集的運算,比如講旋轉等等。使用動詞 ` " . `「執行 ・ 數值」(do ・ numbers), 共位元組陣列轉換做數值;使用動詞 ` " : `「預設格式 ・ 格式」(default format ・ format), 共數值轉換做位元組陣列。
盒仔裝
盒仔裝類型的值是零維純量,毋管是所包含的是按怎的資料結構。使用一箍動詞 ` < `「盒仔裝」(box), 共資料囥入去盒仔內底;使用一箍動詞 ` > `「拍開」(open), 拍開盒仔當中提出其中的資料。猶閣會當通過這个二元動詞 ` ; `「連結」(link)建立盒仔的列表,通過一箍動詞 ` ; `「拆掉」(raze)徙掉一層盒仔的列表。盒仔內底會當裝入其他的盒仔,猶閣會當通過這个二元動詞 ` $ `「重製形狀」(reshape)佮兩箍動詞 ` # `「計件複製」(copy)等操作盒仔佮其列表。
陣列
J 語言的陣列,有仝質(homogeneous)的專案類型,譬如講列表 ` 一二三 ` 是整數的列表,就算講 ` 一 ` 閣會當是一个位。這種類型的問題,佇咧極大程度對編程者是迵光的。干焦特定的特殊運算,會顯露出佇類型上的無仝。譬如講列表 ` 一垺零空吱吱一垺零空吱吱 `,嘿大多數運算,將被當做是完全仝款列表 ` 一零一零 `。
J 語言支援數值疏櫳陣列,通過𪜶的下標儲存非零數值。這佇非零數值相對足少的情況下,是有效率的機制。
其他
J 語言閣支援類和物件,但是𪜶並毋是資料的類型,實際上使用盒仔貯文字提及類和物件,𪜶實為號名語境和編號語境。
此外猶閣有一个偽類型即記憶體對映檔案,伊將變數對映到檔案系統當中的持久檔案。
簡單詞愛彙表
下跤的格簡要列出了常用詞。若有含義中用了間隔號(・)分隔,通常進前的人是干焦一个正手爿參數的一箍含義,後者是正爿兩爿攏有參數的兩箍含義。列出的對應 APL 符號,是 Dyalog 等現代 APL 所採用的符號。
基本
數學
結構
選取
索引
算子
雜類
定語
J 語言的能力,足大的程度來自伊的「定語」(modifier:修飾詞), 這个範圍包括「副詞」和「連詞」:遮的符號接受名詞佮動詞作為運算元(operand), 並且指定方式應用遮的運算元。定語攏會當應用佇啥物動詞,包括使用者寫的動詞,使用者會當寫家己的定語。
J 語言的二箍動詞有正結合性,抑是講咱盡量長正作用域,即伊有儘可能多的右參數。就算子隨定語首先愛用,然後是結果的動詞。就算子隨定語有倒結合性,抑是講咱雖然長篙長的作用域,即伊有儘可能多的倒參數。
副詞
一箍副詞 ` / `「插入去」(insert), 副詞 ` \ `「字條 ・ 著妝娗」(prefix ・ infix), 副詞 ` \ . `「字尾 ・ 外綴」(suffix ・ outfix), 佮連詞 ` ; . `「鉸落來」(cut), 指定參數的諸個規則抑是無規則,並佇其上執行運算。
副詞 ` ~ `「反身 ・ 被動」(reflex ・ passive), 其他的形式會提供予動詞的右參數重複囥佇左參數位置頂懸,二元形式會提供予動詞的左右兩个參數對換位置。
秩
名詞的秩(rank)是排布其原子所依據的軸的數目,即伊的形狀中專案的數目。動詞的秩是伊會當佇咧其上直接運算的右(佮彼个左)名詞參數的上高秩,典型的表示為三个原子的一个列表:` 一元秩二元左秩二元正秩 `。對副詞佮連詞標示的秩,是所形成的動詞的秩。
秩佇咧特定動詞佮特定名詞的頂下文下,將名詞的諸維,劃分做字首諸維的序列,號做框殼(frame); 佮字尾諸維的序列,號做單元(cell)。 秩採用連詞 ` " `「秩」來操縱,對應於 APL 符號 ` ⍤ `,伊有三種形式:` u " n `「指定秩」(assign), ` m " n `「常數動詞」(constant), ` u " v ` 和 ` m " v `「複製秩」(copy), 遮的 ` u `、` v ` 表示動詞運算元,而且 ` m `、` n ` 表示名詞運算元。正數動詞秩,指示講單元諸維的數目,負數動詞秩,指示框殼諸維的數目,` _ ` 指示整體。
二元動詞的左右參數的框架不時是匹配的,就是講的左右參數有仝款數目的單元。如果阮兩个不匹配,有三種會當運算的情形:
一 . 純量一致,若指定兩參數中某一爿的框殼為空,即秩為 ` _ `,這个規个單元被應用佇咧另外一爿參數的所有的單元。 二 . 字首一致,兩參數中有一爿的短框架是另外一爿長框架的字首,短框架仔的逐个單元,予人應用佇咧對應的長框架落去掉字首餘諸維形成的單元陣列的所有的單元。 三 . 字尾一致,兩參數中有一爿的短框架是另外一爿長框架的字尾,這當陣需要用兩爿加上仝款正數增量的方式指定秩,使原短框殼邊仔的框殼做空,原短框殼的諸維形成的這个單元陣列,予原長框殼愛去掉字尾餘下諸維形成陣列的每一个單元陣列。
複合連詞
連詞 ` @ : `「在於」(at)、 ` @ `「頂懸」(atop)、 ` & : `「並列」(appose)、 ` & `「合成」(compose), 是四種複合(composition)。 J 語言支援叫做「勾點」(hook)和「攕仔」(fork)的隱形連詞,二種隱形連詞佮四種複合連詞,規定矣欲按怎共參數抑是共所飾動詞應用佇參數的結果,提供予所飾動詞來做應用的規則。下表列出𪜶的定義:
佇頂懸表格中,` mv=: 零 { v b . 零 `,` lv=: 一 { v b . 零 `,` rv=: 二 { v b . 零 `,遮的副詞 ` b . 零 ` 予出動詞 ` v ` 的三个秩。佇應用四種複合連詞形成新動詞的表達式內底,` @ : ` 和 ` & : `,愛對第一步運算的中央結果,按所在子表達式的秩抑是規个表達式的秩 ` _ ` 進行匯集(assembly), 而且佇咧有需要的狀況下進行框架添充,然後佇這个匯整合的框殼內底進行第二步運算;而且 ` @ ` 和 ` & `,直接佇第一步運算的框架內,著中央結果進行第二步運算;佇整個表達式求值結束的時陣,最終結果佇咧有需要的狀況之下愛進行整體填充。
佇咧 ` x ( u @ v ) y ` 中,一箍 ` u ` 直接佇咧二箍 ` v ` 所劃分的框殼內進行家己的運算。佇咧 ` x ( u @ : v ) " v y ` 中,` @ : ` 共兩箍 ` v ` 的運算結果,匯整合 ` " v ` 所指定的框殼。佇咧 ` x ( u & v ) y `,二箍 ` u ` 直接佇一箍 ` v ` 所劃分的兩个框殼內進行家己的運算。佇咧 ` x ( u & : v ) " mv y ` 中,` & : ` 將一箍 ` v ` 的兩个運算結果,匯整合 ` " mv ` 所指定的框殼。
下面例展示四種複合的中間結果的單元差異:
做連詞 ` & ` 的一个運算元是名詞的時陣,表示「粘上」(bond), 伊通過向這个二元動詞固定提供其一个參數的值而產生一个動詞:
` & ` 衍生的動詞不三時作為一元動詞使用,即 ` m & v y ` 抑是 ` u & n y `;若做了二箍動詞用使用,即 ` x m & v y ` 抑是 ` x u & n y `,左參數列示應用這个衍生動詞佇右參數的次數。需要確保通過 ` & ` 定義的一箍動詞,無出現佇會當取用左右兩个的參數的頂下文中;如此定義的這个二箍動詞,嘛無應該出現佇只會當取用一个正參數的頂下文中。需要注意 ` m & v `、` v / ` 和 ` v \ ` 等的左參數的作用域,有時拄著其倒爿的複合連詞會產生並毋是預期的效果,定定需要表達式整體加以圓括號包圍。
J 語言閣提供連詞 ` & . : `「下底」(under)和 ` & . `「嘿尪仔」(dual)。 下跤定義中的動詞冪 ` ^ : _ 一 ` 表示倒運算:
` @ `、` & ` 和 ` & . ` 合稱做「快複合」(close composition)。 現代 APL 著另外有 ` ¨ `「彼每一个」(each), ` f¨ ` 相當於是 J 語言內底的 ` f & . > `。比如講:
佇咧 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), ` & . ` 對應於符號 ` ¨ `。
用例
下跤是計算歐幾里著範數佮生成數位佮維度坐標一致的整數的簡單例:
佇咧 ` coor ` 用的圓括號包圍,予得 ` @ : ` 處佇規个表達式的上外層,對若形成兩步的運算;正爿邊仔的第一步是圓括號包圍的子表達式,伊的完全加圓括號(fully-parenthesized)形式做:` ( ( ( < @ : > : ) @ i . ) " 零 ) `;倒爿的第二步是 ` { ` 佮複合到其上諸運算構成的子表達式,伊的完全加圓括號形式為:` ( ( ( 十 & # . ) @ > ) @ { ) `。一箍動詞 ` { `「kha-tá-lok-guh 組譯」(catalogue), 應用佇盒仔貯列表的列表頂懸,是接受會當變數目的變長參數的典型的動詞。下跤通過對圓括號包圍的子表達式加以變化,辨析秩連詞佮複合連詞的特性:
下跤的例展示並聯電阻電路計算:$ { \ frac { 一 } { R _ { \ mathrm { total } } } }={ \ frac { 一 } { R _ { 一 } } } + { \ frac { 一 } { R _ { 二 } } } + \ cdots + { \ frac { 一 } { R _ { n } } } $,伊會當如下按呢表達:
動詞冪
連詞 ` ^ : ` 動詞冪」(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 ` 是取值為 ` 零 ` 抑是 ` 一 ` 的變數,則形成布林值條件來執行;若是 ` n ` 是 ` _ 一 `,是進行的 ` u ` 按呢逆運算;若是 ` n ` 是 ` _ `,意味著「收斂」(converge), 隨反映用 ` u ` 一直到結果袂閣再變化。比如講:
對動態冪 ` u ^ : v `,若是 ` x ` 缺席,` u ^ : v y ` 佇咧以 ` y ` 替運算物件迵天代內底,將動詞 ` u ` 應用 ` v y ` 次;若是 ` x ` 存在,` x u ^ : v y ` 佇咧以 ` y ` 替運算物件迵天代內底,將動詞 ` x & u ` 應用 ` x v y ` 次。動詞冪會當形成動態條件執行,遮的動詞 ` v ` 著愛總是產生布林值結果,應用動詞 ` u ` 若是唯一 ` v ` 倒轉來 ` 一 `。進一步 ` u ^ : v ^ : _ y ` 會當形成 while 迴箍構造,只要 ` v ` 倒轉來 ` 一 `,就重複的執行 ` u `,一直到 ` v ` 倒轉來 ` 零 `,抑是講 ` u ` 將伊的參數無變化的倒轉去。比如講:
動名詞
佇咧 J 語言內底,動名詞(gerund)是叫做「原子表示」伊的特殊的盒仔一个列表,這種篋仔會使像任何的盒仔仝款使用,會使到尾仔轉變著愛執行的動詞。關於動名詞的運算有:
- 連詞 ` ` ` ` `「連結動名詞」(tie or gerund), 建立動名詞。
- 連詞 ` ` ` : ` `「喚起動名詞」(evoke gerund), 佇咧加以運算元了後成做:
- ` ` ` : 六 ` `,動名詞會當轉做動詞列車;
- ` ` ` : 零 ` `,欲轉變來遮的動詞分別單獨應用,並且共𪜶的結果收集做一个列表。
- 連詞 ` @ . `「議程」(agenda), ` m @ . n ` 對動名詞 ` m ` 中,選擇出第 ` n ` 個原子表示,共轉變到動詞閣執行伊。
下面是動名詞簡單範例佮考拉茲猜想範例:
定義
J 語言支援使用者進行顯式定義,和 ` { { `…… ` } } ` 形式的直接定義。下面是用五種複合作做顯式定義的例:
下跤以矩陣乘法做直接定義的例,並順帶演示秩連詞的用法:
APL 傳統上的共內積 ` Pf . gQ ` 解說講為 ` f / PgQ `,J 語言的矩陣乘法要求寫為 ` Pf / . gQ `,無隱含的做左運算元 ` f ` 附加一箍 ` / `。轉置嘛是有較大開銷的運算,無仝款的矩陣乘法演算法有無仝款的參照局部性。
- ` matmul ` 通過 ` " ( 一 _ ) ` 將 ` u @ : v ` 的右參數對向量擴充做一般陣列,伊用佇右參數為行主序陣列的情況。佇咧向量佮向量列表二者諸項之間每對的進行乘積累加運算,是 BLAS 的標準演算法。
- ` inner ` 採用兩向量的點積運算 ` u @ : v " 一 `,伊適宜直接用佇右參數做列主序陣列的情形。佇右參數為行主序陣列的時陣,需要如比如講例來講碼按呢,對正參數陣列進行兩箍轉置 ` 零 & | : `,遮的 ` 零 ` 指示會共頭一題安排到上尾仔位置其他的保持原序進前徙去。這種因為點積的實現,通常需要進一步加以迴圈框1875。
- ` outer ` 會當看作 ` matmul ` 的變體,伊首先對倒參數陣列進行轉置,然後進行多組的向量佮一般陣列之間二元的張量積運算 ` v / " _ 一 `,最後佇咧各組結果的列表頂懸進行 ` u ` 計算,每組運算了後參與其中的左右兩陣列的元素袂去予其他組的運算閣再存取。
- ` revmul ` 仝 ` inner ` 仝款適宜直接用佇右參數做列主序陣列的情形,但是採用仝 ` matmul ` 類似的計算方法,伊佇乘法進前對倒參數陣列和佇乘法了後著結果欲做轉置,` matmul ` 佮 ` revmul ` 的關係親像彼 $ \ , ( \ mathrm { AB } ) ^ { \ mathsf { T } }=\ mathrm { B } ^ { \ mathsf { T } } \ mathrm { A } ^ { \ mathsf { T } } \ , $。` matmul ` 一改性存取倒參數陣列,重閣加一改存取正參數陣列;` revmul ` 一改性存取正參數陣列,反起濟擺存取倒參數陣列。
佇咧隱式定義內底,遞迴定義會當袂通過名參照家己,轉而使用動詞 ` $ : `「自參照」。 比如講遞迴的計算斐波彼契數列:
` _ 九 : ` 到 ` 九 : ` 是常數動詞。動詞 ` [ : `「帽子」,用咧連詞 ` u : v `「一箍佮二箍定義」所應用的動詞位置,即充任一箍動詞 ` u ` 抑是兩箍動詞 ` v `,會當分別佇兩款情形下報毋著:定義的是二箍動詞,煞無適當的被用作一箍動詞;抑是定義的是一箍動詞,煞無適當被用做兩箍動詞。
佇顯式定義佮直接定義內底,提供了類似其他的過程語言的控制結構。遮列出的是每一个範圍內底的代表性控制字:
索引
J 語言的索引機制採用兩箍 ` { `「來自」(from)動詞來完成,伊有兩種形式,分別為左參數做索引陣列的主軸索引,佮左參數做二層抑是一層盒裝結構的逐題索引,二者分別對應 APL 中,方括號內做孤一个軸的主軸索引選取,佮方括號內為 ` ; ` 分隔的真濟个軸索引選取。
主軸索引
索引陣列的每個案指定對主軸的專案單元的一个選取,共𪜶的結果閣敆做一个陣列。負值索引表示對尾仔進前記數。佇咧 APL 中,這種形式的索引予人號做「來自」(from), 嘛是叫做「選取」(select)抑是笑詼的人講「明智」(sane)索引,上早出現佇咧 SAX(SHARP APL for UNIX)嘿其實 ` @ `「來自」索引的擴充中間,部份現代 APL,來共表示做符號 ` ⊇ `。比如講:
逐心索引
逐心揀會當形成子陣列,佇現代 APL 中,伊予人表示做 ` ⌷ `,故而且嘛予人稱做「扁方塊」(squad:squish quad)索引(indexing)抑就叫做「索引」(index)函式。裝佇兩層盒仔裝結構當中的,是對應諸軸的一層盒仔裝結構的列表,其中每一層盒仔貯仔結構內攏是數值列表,伊對應這內底一个抑是幾个仔專案選擇。預設攏總選使用名詞 ` a : `「啊啥物」(ace)指示,伊是一个盒仔貯空的 ` < 零 $ 零 `。佇尾溜的連紲濟的預設攏選無需要寫出。比如講:
伊閣支援一層盒仔裝結構,裝佇其中的是數值列表,伊的元素指示一軸選取一个專案,若單揀著所有的時陣,則指定一个原子專案。一層盒仔裝結構當中的這个數值列表,等價數佇兩層盒裝結構中一層盒裝的單一數值的列表。兩種的索引形式會當結合使用,即可以共盒仔裝結構的陣列做予 ` { ` 的倒參數,伊按這个陣列的形狀敆真濟个逐家選取的結果。比如講:
比如講 ` ( < < 一二 ) , ( < a : ; 零二三 ) ` 這款的選取是合法的,將形狀無一致的選取結果敆做伙,會致使結果值填充。
重排軸
重排軸嘛叫做二箍轉置。APL 的兩元轉置對軸次序的指定,類似佇組合數學中換的一行形式的柯西表示法,伊予人叫做「可能是 APL 編程者尾仔掌握的原始運算之一」。 J 語言的字元轉置對軸次序的指定,無牽涉就共幾个軸對映到結果中的一个軸的狀況,使用普通索引形式的置換向量。在置換向量的元素素素小於陣列軸的數目之時,J 語言在置換結果中共其指定的諸軸安排佇尾仔,若其他的軸保持原來對次序前徙。
針對向量的索引運算是無加盒仔裝的主題索引。用一般陣列的選取向量,需要一層盒仔裝來對其進行逐軸索引。置換向量 ` p ` 所對應的顛倒向換向量是 ` / : p `,對兩條換向量 ` p ` 和 ` q `,則有 ` / : p { q ` ↔ ` ( / : q ) { / : p `。
兩箍轉置佮索引機制有密切的關聯,伊有兩个重要性質:
- 兩擺連紲的兩箍轉置,會當變做等價形式:` p | : q | : A ` ↔ ` ( p { q ) | : A `,就先將後者置換向量 ` p ` 嘿前者置換向量 ` q ` 進行置換,然後用結果的對換向量做一擺兩箍轉置。
- 著二元轉置了後的陣列,進行原子專案的選取,會當變做等價形式:` ( < k ) { p | : A ` ↔ ` ( < ( / : p ) { k ) { A `,就先用置換向量 ` p ` 換向落來 ` / : p `,著選取向量 ` k ` 進行置換,然後用結果的選取向量來選取無轉置陣列。
下面是演範例代碼:
範例
帕斯卡三角
下跤例形成帕斯卡三角的二項式係數的直接定義,並順帶展示基本的矩陣佮盒仔裝運算:
二項式係數嘛會使寫做隱式定義形式:
簡單圖表
下跤是面是二箍副詞 ` / `「形成格仔」(table), 做條形圖佮散點圖的簡易圖表例 :
遮用著的 Unicode 角元素字元嘛出現佇咧 IBM PC 頁碼四百三十七之中。
遮的 ` scatterChart ` 會當使用二元副詞 ` } `「修改」(amend)來實現:
對角線選取
APL 的兩箍轉置,佇咧多個軸對映著結果中的一個軸的情況下,共安排去前導位置頂懸閣進行對角線選。下跤基於一箍動詞 ` I . `「真值位置來𤆬」,定義進行對角線選取的動詞 ` diag `,伊的左參數是布林值列表,其中的真值 ` 一 ` 指示佮其位置對應的軸,愛以次安排佇前導位置而且進行對角線選取,其他的假值 ` 零 ` 所對應的軸相對位無改變。
遮局部定義 ` s `,伊的左右參數仝款予 ` diag ` 的參數,伊生做兩箍紡起來需要的置換向量,這是由著欲安排去進前導位置的那些軸的位置索引,佮下跤其他的位置索引串接抑若成。遮的 ` { . ~ $ @ $ ` 以右參數的諸軸數目選取倒參數,用來佇倒參數的真值佮假值的總數小於右參數的諸軸數目之時,對倒參數填充上假值。
紲落來局部定義 ` t `,伊的左參數攏是予 ` diag ` 的布林值列表中真值 ` 一 ` 的數,右參數是愛對其指定數目的前導軸進行對角線選取的陣列,伊生做對角線選取所需要的一層盒仔裝選取列表。遮的 ` ( < . / ) @ ( { . $ ) ` 選出欲進行對角線選取的前導諸軸的最小長度,用 ` i . ` 形成這个長度的整數列,才閣用 ` # & 一 @ [ ` 形成其長度共倒參數的攏全為 ` 一 ` 的列表,通過 ` * / ` 佇咧二者之上形成表格矩陣。
上尾的表達式先進行指定的兩箍轉置,閣對其結果進行相應的對角線選取。下面是簡單用例:
快速排序
J 語言提供的排序機制基於了穩定排序演算法,下跤的例代碼是快速排序的直接定義:
遮定義一个動詞 ` cmp `,伊通過逐个做兩个數的差而且取其符號,得著取值為 ` _ 一 `、` 零 ` 抑是 ` 一 ` 的平衡三進位值。` cmp ` 將作為倒運算元傳達予副詞 ` quicksort `。
佇咧 ` quicksort ` 的定義內底,向局部變數 ` s ` 傷過價值的表達式,第一步隨機選擇支點(pivot)運算,首先計算 ` ? # y `,生成佇資料總個數範圍內的亂數,了後佇其上計算 ` { ~ `,選擇出佇咧亂數指定的位置的支點值;伊的第二步運算,將運算元 ` u `,應用到其左參數的資料列表,佮正參數的支點值二者之上。
隨後是串接分治運算結果,首先將平衡三進位值列表,分別佮 ` 零 ` 做每樣的三分法比較,得著三个布林值列表;然後用這種列表中的 ` 零 ` 和 ` 一 ` 做件數,複製出資料列表的符合這个條件一个新的子列表,其中兩个作為參數傳達予遞迴呼叫進行排序。
下跤的快速排序實現,展示著隱式編程,將函式複合做伙,顯式參照任何的變數,無欲講應用佇其頂的形式參數。遮會共頭前代碼中向局部變數 ` s ` 值的時陣所求值的表達式改做隱式定義,成做勾點的頭一步運算的方式,代入參照這个變數的表達式之中,並且採用勾點的參數複製機制消隱了形式參數 ` y `:
提供予連詞 ` ^ : ` 的倒爿運算元,外層是一个一箍勾點,伊欲提供予伊的單一正資料參數,重複囥佇伊的左資料參數位置。這外層一箍勾點的第一步運算,是生成平衡三進位值列表的岫狀的二層一箍勾點 ` ( u ( { ~ ? @ # ) ) `;外層一箍勾點的第二步運算,共生做的三个子列表串接起來。生做三个囝列表的表達式,以資料列表是作為倒參數,用平衡三進位值列表作為右參數;遮的三个二箍勾點首先生成布林值列表,來進行著換左右參數位置的二箍複製運算,到尾仔𪜶中間有兩个通過自參照 ` $ : ` 進行矣遞迴呼叫。
這个定義中的 ` $ : ` 是佇這个副詞的私有語境內呼叫的動詞,所以無像頭前直接定義按呢需要加上運算元 ` u ` 以副詞形式來呼叫。遮無對字串長度較細漢等於 ` 一 ` 的狀況來進行處理,這是因為迵天代運算佇條件不滿足時返回初初值,也就是返回這个字串本身。將 ` cmp ` 的表達式,代入定義中的左運算元 ` u `,就會當定義出動詞,同時嘛無需要外在的採用直接定義的形式。
共一箍勾點替代替倒分支為 ` ] ` 的攕仔,成做的動詞列車閣較通讀性:
下跤的例定義是一箍 ` / : ` 進行字較會穿的 ` cmp `:
佇這个 ` cmp ` 定義中,` / : @ ; ` 先共兩字串參數進行盒仔貯好勢,然後一箍 ` / : ` 予出兩項人的升序索引,二者之間為著升序抑是相𫝛的時陣為 ` 零一 `,啊若二者為降序的時陣為 ` 一零 `;到這个升序抑是仝款猶閣需要分別,`-. @-: ` 來判斷兩參數敢有為著「無相𫝛」,無相𫝛的時陣為 ` 一 `,相𫝛時為 ` 零 `。遮的副詞 ` ; . _ 一 `「自有區間」,使用字串的第一字元作為分隔符,著字串進行劃分並去除分隔符,然後應用所修削的動詞佇遮的子字串頂懸。
全排列
下跤的例共出 ` n ` 個案的所有置換的有次序的矩陣。首先定義名詞 ` p 三 `,伊是長度為 ` 三 ` 伊的排列矩陣:
遮咧用著矣動詞:` A . `「易位詞」(anagram), ` x A . y ` 的倒參數 ` x `,指定落去長度為著 ` # y ` 的所有的置換中予特定一个置換的編號,所以編號置換 ` y ` 的這个案。遮求全排列的數目,用著一箍動詞 ` ! `「階乘」。 接咧佇 ` p 三 ` 的基礎頂面,實現長度為 ` 四 ` 伊的排列矩陣:
遮的 ` { " ( _ 一 ) `,著其正爿的 ` 四 ` × ` 四 `「奇妙」矩陣的每一行,照其倒爿加工了後的 ` 三 ` 元素全排列,嘿其後壁的 ` 三 ` 個元素進行排列。這步寫出的排列動詞的結果是三維陣列,重製形體叫做矩陣:
二箍動詞 ` $ ` 的左參數的值為 ` ( ! y ) , y `,遮的 ` y ` 是予人排列動詞的資料參數;伊的正參數是用一箍動詞 ` , ` 將三維陣列散開了後形成的一个向量。
才閣共內底的 ` p 三 `,替代為遞迴的自呼叫 ` $ : @-& 一 `;並通過名詞秩,形成常數動詞 ` ( 一零 $ 零 ) " _ `,設定長度做 ` 零 ` 時的基礎值為 ` 一零 $ 零 `:
到尾仔共遞迴形式改做迵天代形式,會當採用連詞 ` F . . `「單結果正向拗疊」(fold single forward), 使用伊需要事先安裝外掛程式 ` dev / fold `:
人若無採用連詞 ` F . . `,會當因為一箍副詞 ` / `「插入去」而且家己實現拗疊算子:
性命遊戲
佇咧 J 語言內底,提供了兩箍的副詞 ` ; . ± 三 `「子陣列」(subarrays), 伊是 ` ; . `「鉸落來」(cut)的三種形式之一,也予人叫做密鋪(tessellate)抑是框1875(tile)。 ` x ( u ; . _ 三 ) y ` 應用動詞 ` u ` 佇因為 ` x ` 指定的 ` y ` 的有仝款形狀的逐个正規鞏Festival之上。` ; . 三 ` 佮之類似,但無挕捒結果無完整的框1875。
現代 APL 所使用的二箍算子 ` ⌺ `「模板」(stencil), 才佇邊仔的處理上無仝款 J 語言的鞏Festival,伊欲求框嵌子陣列逐个軸的中心,佇咧長度為奇數的時陣是 ` y ` 元素,佇咧長度為偶數的時陣佇咧其元素之間,而且用添充(fill)元素滿滿超出的部份,伊的預設徙動步長是 ` 一 `。下跤佇 ` ; . _ 三 ` 的基礎頂面,利用兩箍的動詞 ` { . `「採取」(take)添充特性,定義一个 ` stencil ` 實現:
這个定義干焦向運算元提供一个正參數即鞏Festival子陣列,無提供仝一个子陣列對應的諸軸填充數目做倒參數,APL ` ⌺ ` 算子提供伊,意圖佇需要時籍此徙掉添充。遮共框1875去規定矩陣定義做正運算元 ` n `,其實第一行是子陣列的一軸長度,第二行是逐題的移動步長,這个行次序佮 ` ; . ± 三 ` 的規定顛倒反。遮的 ` p ` 是予 ` ; . _ 三 ` 的鞏Festival規定矩陣,` r ` 是逐題佇頭殼佮尾的補充數量,` s ` 是當佇咧控制尾添充,` t ` 是負值控制頭殼添充。佇下跤的簡單用例中,數值陣列的添充元素是 ` 零 `:
下跤實現康威性命遊戲,伊是對 Moore 鄰域的一種細胞自動機 :
遮的實現演算法,共性命遊戲規則合併入一个單一表達式中,伊由 Arthur Whitney 提出。算法的第一步驟用 ` + / @ , ` 合計逐格點佮其周圍格點內底 ` 一 ` 數目,閣共伊局部囥佇咧 ` s ` 中。第二个部份會當為頭前的結果佮 ` 四 ` 做相比較,才佮當前狀態 ` y ` 做邏輯和運算,干焦佇咧當前格點為 ` 一 `,而且周圍格點合計為 ` 三 ` 的狀況之下,彼个前格點會著真值 ` 一 `。第三步彼个序大 ` s ` 減去頭前的結果真值,才閣佮 ` 三 ` 做相比較。佇這个最終結果當中,彼个前格點會著真值 ` 一 ` 有兩類情形:⑴ 伊佇咧 ` s ` 中的值為 ` 四 `,並減去矣真值 ` 一 `,這就是第二步運算所選定的情形;⑵ 伊佇咧 ` s ` 中的值為 ` 三 `,而且減去第二步驟運算佇這種情形下必然著出的假值 ` 零 `,這閣真幼分做兩款情形:當前格點為 ` 零 `,而且周圍格點合計為 ` 三 `;抑是當前格點為 ` 一 `,而且周圍格點合計為 ` 二 `。遮用著的 Unicode 字元佇幾何圖形區段中。
這个演算法會當寫做隱式定義形式:
佇咧 J 語言內底,實現以遞推關係定義的序列,避免出現 $ \ , O ( n ^ { 二 } ) \ , $ 的時間複雜度,會當採用連詞 ` F : . `「濟結果正向拗疊」(fold multiple forward), 使用伊需要事先安裝外掛程式 ` dev / fold `;伊無輸出倒參數的初始值,若提供的正參數為空值,伊的輸出為空值,抑無伊輸出逐改迵天代的結果。上例中的迵天代算式會使覆寫做:
人若無採用連詞 ` F : . `,會當家己實現輸出中央結果的拗疊算子:
佇遮的 ` foldlist ` 中,將 ` r=.[a=. x ` 改做 ` r=. u a=. x `,著 ` ( < , < foldlist ( life @] ) & ( 七 $ 零 ) ) ` 可改為 ` < foldlist ( life @ ] ) & ( 七 $ 零 ) `。
鍵分組
佇咧 J 語言內底,提供了兩箍的副詞 ` / . `「鍵分組」(key), 伊揤倒參數內底的唯一鍵,著右參數進行分組(group)抑是講號做分割區(partition), 閣將所修削動詞應用著遮的分組之上。分組次序一箍副詞仝款 ` ~ . `「唯一值」處理結果的順序,伊除去匹配頭前出現過的專案的任何專案。下面佇伊的基礎頂面,定義對應現代 APL 使用的字元算子 ` ⌸ `「鍵分組」(key)的一个副詞,伊將所修削的動詞應用佇唯一鍵和相應的分組二者之上,伊閣加一箍佮兩箍兩種形式:
伊的兩元形式的倒參數有唯一鍵,正來參數是愛分組的資料;伊的一元形式的正參數有唯一鍵,所分組的是右參數諸專案的索引值。下面是這个鍵分組副詞所適用的動詞的簡單範例:
下面的例通過鍵分組來揣著一个單詞列表中的易位詞:
亂數
佇咧 J 語言內底,提供了二箍的動詞 ` I . `「區間索引」,伊倒參數 ` x ` 必須是有順序的,對定義 ` 一 + # x ` 個區間,除了最後一个以外的每一个區間,攏有含並結束佇咧 ` x ` 的一个案,上尾仔一个結束佇當無散食,第一个開始於負無散;伊應用佇右參數 ` y `,給出 ` y ` 所在的區間的索引。
下跤的例產生符合指定離散概率分布的亂數列表,遮定義矣動詞 ` ran `,伊根據倒參數 ` x ` 予出的正實數向量中的遮的權重,對 ` i . # x ` 中選出由右參數 ` y ` 指定個數的亂數列表:
遮首先通過 ` ? @ $ & 零 `,生做指定數目的佇區間 ` ( 零 , 一 ) ` 中的隨機浮點數,伊嘛會當寫為等價的 ` ? @ ( $ 零 : ) `。揬揬仔 ` + / \ % + / ` 中,使用一箍副詞 ` \ `「字條」修飾動詞 ` + / `,對算是權重向量的字條佮,閣用字首和除以總和著愛出累積分布函式。` + / \ `、` < . / \ ` 和 ` > . / \ `,是 J 語言會對其進行速度最佳化的特殊組合。到尾仔通過區間索引,佇有隨機浮點數落入特定區間的時陣,生做這个區間對應的隨機整數。
動詞 ` ran ` 的表達式是一个二層二元勾點,外層勾點的第二步運算干焦應用到正參數頂頭,伊的第一步運算將內層勾點,整體修削兩箍副詞 ` ~ `「被動」著愛換兩个參數的位。內底勾點的第二步運算 ` + / \ % + / ` 干焦用著實際上的左參數頂懸,伊的第一步運算 ` I . ` 修飾矣 ` ~ `,將頭前獨獨針對左右兩參數的運算結果,閣再對換轉來原先的左右位置頂懸。
下面是將區間索引和鍵分組結合起來的例,演示林德伯仔-列維中心極限定理 :
遮定義的 ` summary ` 局部有兩个局部有變數 ` l ` 和 ` r `,會當共這兩个局部分值去掉,共這兩个局部變數的出現替代為運算元 ` m ` 和 ` n `,按呢對伊的呼叫將變做 ` ( 八十 & ( 零 summary 一 ) ) ` 按呢的形式。閣紲落去代碼結合頭前兩个例,採用著無仝佇咧上例連紲型齊勻分布的其他分布作為獨立仝分布,佮無仝款的本平均:
SQLite 掛程式
佇管理員權限下跤,安裝操縱 SQLite 資料庫的外掛程式:
SQLite 資料庫的簡單用例:
字典類
J 語言採用號名的語境實現類,採用編號的語境實現物件,下跤的範例建立字典類:
佇厝裡 kha-tá-lok-guh 中建立一个 ` dict . ijs ` 檔案閣錄入去頂懸講代碼,紲落來若是下代碼建立字典的物件並對其進行檢視佮簡單操作:
參見
- 秩 ( J 程式語言 )
參照
外部連結
- JSoftware,J 的官方網站
- GitHub 上的 Jsoftware 頁面–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 K . W . Hui
- APL to J Phrasebook
- J-APL Wiki
- 郭平欣譯 J 字典