跳轉至內容

軟體工程師手冊/語言詞典/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 動詞,這些動詞的實參在隱式定義的陣列 y 中可用。(句點是名稱的一部分)。這可以透過使用字元陣列字面量來命名這些變數作為 = 的左實參來解包成一系列區域性變數。

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 軟體出版物頁面提供許多書籍。

這些書籍涵蓋從初學者到高階的各個方面。許多書籍可以免費下載。一些書籍需要購買(例如,在亞馬遜網站上購買)。

華夏公益教科書