assembly.jc 2018-9-29 13:31
之前介紹過 J,start up and installation 相關事宜和一般討論,請到: [url=https://computer.discuss.com.hk/viewthread.php?tid=27742554]https://computer.discuss.com.hk/viewthread.php?tid=27742554[/url]。這帖主要講下語法。
可惜找不到 online REPL,要試真的只有 Install J 一途徑。
[[i] 本帖最後由 assembly.jc 於 2018-9-29 01:36 PM 編輯 [/i]]
assembly.jc 2018-9-29 13:49
簡單就是美,第一樣想講的是 operator precedence,很奇怪吧,是,因為和其他 language 好唔同。
例如:
2 * 2 + 3
output: 10
其他的 language 是 (2 * 2) + 3 = 7,而 J 是 2 * (2 + 3) = 10,看明白了嗎?
不是說 + 的 precedence 比 * 高。而是 J 沒有 operator precedence,evaluation 由最右的 operation 開始。簡單吧。
[[i] 本帖最後由 assembly.jc 於 2023-10-22 03:49 編輯 [/i]]
煙民母親生賤種
*** 作者被禁止或刪除 內容自動屏蔽 ***
assembly.jc 2018-9-30 12:01
[quote]原帖由 [i]煙民母親生賤種[/i] 於 2018-9-30 01:56 AM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=488135712&ptid=27746869][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
咁仲學??:fst_012: [/quote]
這樣才好
assembly.jc 2018-9-30 12:12
J 是 所謂的 array-oriented language,這點和 R 有點似。沒有 Looping,這個 concept 處理大量 data 時很正。
例如: 2個 array 相加和相乘:
1 2 3 + 1 2 3
output: 2 4 6
1 2 3 * 1 2 3
output: 1 4 9
由 1 加到 5:
+ / 1 2 3 4 5
output: 15
煙民母親生賤種
*** 作者被禁止或刪除 內容自動屏蔽 ***
assembly.jc 2018-10-1 15:45
[quote]原帖由 [i]煙民母親生賤種[/i] 於 2018-10-1 03:05 AM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=488190629&ptid=27746869][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
咁先好?? :fst_012::fst_012: [/quote]
係,方便,唔駛記咁多野
assembly.jc 2018-10-1 15:56
Insert verb: /
J 的除法用 % 這個符號,例如 10 除 2,
10 % 2
output: 5
原因是 / 保留用作 'Insert' (function),好似上一個帖最後的例子:
+ / 1 2 3 4 5
意思是把 + insert 在 1 2 3 4 5 之間,即
+ / 1 2 3 4 5 => 1+2+3+4+5 = 15
/ insert 的用途很廣,功能和 FP 的 fold 相似。例如,在 array 中找最大的數字。
>. / 5 63 9 1 => 5 >. 63 >. 9 >. 1
output: 63
其中,x >. y = max(x, y) return 兩者中最大的。
[[i] 本帖最後由 assembly.jc 於 2018-10-1 03:59 PM 編輯 [/i]]
煙民母親生賤種
*** 作者被禁止或刪除 內容自動屏蔽 ***
assembly.jc 2018-10-2 12:53
[quote]原帖由 [i]煙民母親生賤種[/i] 於 2018-10-2 02:42 AM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=488240469&ptid=27746869][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
佢刻意將D符號咁轉化。其實大家心裏有數佢想點啦。係扮到好似係新野咁。點解一定要用 / 做其他用途? + - * / ,呢類所有程式都係咁用,我唔覺得佢有必要一定要將 % 代表 / 囉。:fst_015: ... [/quote]
之前帖子已經說了,J 前身是 APL,APL 已經有 50 年的歷史,比 C 仲舊,唔係新野泥。
xianrenb 2018-10-2 14:00
[quote]原帖由 [i]assembly.jc[/i] 於 2018-10-2 12:53 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=488256943&ptid=27746869][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
之前帖子已經說了,J 前身是 APL,APL 已經有 50 年的歷史,比 C 仲舊,唔係新野泥。 [/quote]
基本上只要是正常電腦語言,任何算法都可以用該語言寫得出。
所以正常論電腦語言優劣,都是運算速度, code size 、 memory size 及可讀性。
頭三樣其實大部份情況無所謂,有所謂的,基本上用 C 語言已經一定 ok 。
所以重點是可讀性。
但看來前面 J 語言的一個 quicksort 寫法真的太難讀了。
我看類似 functional programming language 的電腦語言都好難讀。
其實一般使用者寫出來,一年半載後再看,能否立刻看得明呢?
至少我自己認為自己不能,因為連寫都未必寫得出,哈!
我認為一個好的電腦語言,最好語法接近所謂的 pseudocode 寫法。
那麼,幾乎不用學,就立刻看得明用該語言寫的程式。
stupidsing 2018-10-2 18:52
[quote]原帖由 [i]xianrenb[/i] 於 2018-10-2 02:00 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=488260217&ptid=27746869][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
其實一般使用者寫出來,一年半載後再看,能否立刻看得明呢? [/quote]
有所謂 acquired taste, 未飲過酒隊威士忌實嘔,飲慣左就離唔到口。
學過箇中窺門,幾年後都睇得明返。
但係話成 team 人都要識函數式玩法,通常係較尖端請貴人的project 先用,起貨會快。
assembly.jc 2018-10-2 19:03
[quote]原帖由 [i]xianrenb[/i] 於 2018-10-2 02:00 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=488260217&ptid=27746869][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
基本上只要是正常電腦語言,任何算法都可以用該語言寫得出。
所以正常論電腦語言優劣,都是運算速度, code size 、 memory size 及可讀性。
頭三樣其實大部份情況無所謂,有所謂的,基本上用 C 語言已經一定 ok 。
所以重點是可讀性。
但看來前面 J 語言的一個 quicksort 寫法真的太難讀了。
我看類似 functional programmin ... [/quote]
之前說過 FP 唔止難讀,而且唔係 Programmer Friendly。語言以外還有好多理論要學,例如之前說的 forall,Norman Ramsey 就打趣說無人可以只用英文解釋清楚它的意思 ([url=https://stackoverflow.com/a/3071365/7940614]https://stackoverflow.com/a/3071365/7940614[/url]),要唔要進入這個領域,好視乎個人的興趣。
idontknowjack 2018-10-2 19:57
也有可能是「習慣」使然。
幾十年前法國做了個研究,比較初學 programming 的學生學 Lisp 與 另一 algo-based 的語言。結果是學習速度和之後的應用上沒有大分別。推翻了 Lisp 難學難用的印象。
assembly.jc 2018-10-5 13:36
[quote]原帖由 [i]idontknowjack[/i] 於 2018-10-2 07:57 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=488277373&ptid=27746869][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
也有可能是「習慣」使然。
幾十年前法國做了個研究,比較初學 programming 的學生學 Lisp 與 另一 algo-based 的語言。結果是學習速度和之後的應用上沒有大分別。推翻了 Lisp 難學難用的印象。 ... [/quote]
但最後都係 algo-based 之類的 imperative language 盛行。可見這類 scalar value 為運算單位的方式,更接近人類的直覺思維,即係更易學易用。但近年這種方式似乎也走到盡頭。
Susan﹏汪汪 2018-10-5 13:57
其實汪汪仲有個唔喜歡pure FP lang的原因
係多數都出現好多不明不白的operators
好似前面講J寫insert[code]+ / 1 2 3 4 5 => 1+2+3+4+5 = 15[/code]用Swift雖然也可以自創operators
[attach]8848647[/attach]
但汪汪唔會用係實用上
因為以後再睇返的話根本唔會知道發生緊咩事
assembly.jc 2018-10-5 14:56
[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2018-10-5 01:57 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=488430181&ptid=27746869][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
其實汪汪仲有個唔喜歡pure FP lang的原因
係多數都出現好多不明不白的operators
好似前面講J寫insert+ / 1 2 3 4 5 => 1+2+3+4+5 = 15用Swift雖然也可以自創operators
8848647
但汪汪唔會用係實用上
因為以後再睇返的話根本唔會知道發生緊咩事 ... [/quote]
對,Swift 同 F# 一樣,都可以自創operators,非 FP 都應該禁止,或者 compile 時加 warning。因為以後再睇返的話根本唔會知道發生緊咩事。
assembly.jc 2018-10-5 15:07
J function 有幾種,其中最常用的是 verb (還有 adverb, conjunction)
而 verb (function) 最多只可以有 2 個 parameters, 或者 1 個 parameter,但唔可以無 parameter。
例如:
1. +: 1 + 2 有 2 個 parameters
2. -: 1 - 2 有 2 個 parameters, -3 就只有 1 個 parameter
verb 對於唔同數量的 parameter 可以有唔同的操作,即係 overload,例如 -, 可以是 2個數相減,或將正數變負數
assembly.jc 2018-10-5 16:29
dot product:
+/ 1 2 3 * 4 5 6
[[i] 本帖最後由 assembly.jc 於 2018-10-7 12:30 PM 編輯 [/i]]
Susan﹏汪汪 2018-10-5 17:13
[quote]原帖由 [i]assembly.jc[/i] 於 2018-10-5 02:56 PM 發表 [url=https://www.discuss.com.hk/redirect.php?goto=findpost&pid=488433251&ptid=27746869][img]https://www.discuss.com.hk/images/common/back.gif[/img][/url]
對,Swift 同 F# 一樣,都可以自創operators,非 FP 都應該禁止,或者 compile 時加 warning。因為以後再睇返的話根本唔會知道發生緊咩事。 [/quote]
其實swift裡面差不多全部operator 都是standard library 的"custom operator"
例如普通的加減乘除、equals 、not equal、大於小於、not
[url=https://github.com/apple/swift/blob/master/stdlib/public/core/Policy.swift]https://github.com/apple/swift/blob/master/stdlib/public/core/Policy.swift[/url]
除左assignment operator係compiler magic 之外[code]let a = 50[/code]基本上, 再無厘頭的operator都可以創出來
[attach]8849251[/attach]
[[i] 本帖最後由 Susan﹏汪汪 於 2018-10-5 05:21 PM 編輯 [/i]]
assembly.jc 2018-10-5 18:22
[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2018-10-5 05:13 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=488439871&ptid=27746869][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
其實swift裡面差不多全部operator 都是standard library 的"custom operator"
例如普通的加減乘除、equals 、not equal、大於小於、not
[url=https://github.com/apple/swift/blob/master/stdlib/public/core/Policy.swift]https://github.com/apple/swift/blob/master/stdlib/public/core/Policy.swift[/url]
除左assignment operato ... [/quote]
所以說無咁嘅必要,乜功能都有,就無左本身嘅特色。
Susan﹏汪汪 2018-10-5 19:41
[quote]原帖由 [i]assembly.jc[/i] 於 2018-10-5 06:22 PM 發表 [url=https://www.discuss.com.hk/redirect.php?goto=findpost&pid=488443240&ptid=27746869][img]https://www.discuss.com.hk/images/common/back.gif[/img][/url]
所以說無咁嘅必要,乜功能都有,就無左本身嘅特色。 [/quote]
又未必完全冇意義
好似swift其中一個十分常用的range operator
[code]
let range = 1...10
[/code]
[code]
for x in 0..<width {
// do works
}
[/code]
如果係swift 4以前standard library 冇one side range
但到左swift 4之後、例如要表示1至無限的話
[code]
let natural = 1 ...
[/code]
而呢個one side range也只不過係就咁用swift custom operator 的方法簡單地加入standard library
唔需要改compiler 的功能
而且當時D人提出要增添呢個功能、也是用舊版本的swift compiler
自己寫custom operator 就做到demo
=============
再其他的更實用功能
就好似汪汪自己的library 咁
雖然汪汪冇寫新增的custom operators、不過也寫左大量operator overloading
如果好似javascript 咁連operator overload 都唔準
會寫左大量呢類code出來
[code]
vec_a.mul(vec_b).add(vec_c.mul(vec_d))
[/code]
更何況
其實寫程式都只是為左方便易懂
用常識的角度、唔過份的話係冇問題
好似Javascript 咁搞的話
結果D code會更難睇得明
assembly.jc 2018-10-6 14:26
[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2018-10-5 07:41 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=488447200&ptid=27746869][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
又未必完全冇意義
好似swift其中一個十分常用的range operator
let range = 1...10
for x in 0.. [/quote]
都是些 syntactic sugar 的東西。不過最後 vector 的例子倒說明了 operator 和 associative 對於簡化表達式的重要性。
頁:
[1]