跳轉到內容

軟體工程師手冊/語言詞典/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 軟體出版物頁面 提供了許多書籍。

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

華夏公益教科書