感受 Erlang(2)
來源:互聯網
上載者:User
個色的 #看到這個標題,恐怕會讓人覺得莫名其妙。其實我自個兒看著也不順眼。“個色”是北京話,大致是“獨特”的意思。說一人“個色”,多半不是誇獎,而是貶損。# 是 Erlang 文法中的一個操作符。所以,標題的意思就是:獨特的Erlang操作符 #。之所以注意到 #,是因為讀《Programming with Erlang》時遇到的疑惑:2> X=#todo{}. #todo{status = reminder,who = joe,text = undefined} 3> X1 = #todo{status=urgent, text="Fix errata in book"}. #todo{status = urgent,who = joe,text = "Fix errata in book"} 4> X2 = X1#todo{status=done}. #todo{status = done,who = joe,text = "Fix errata in book"} 起初,我的看法是這樣的:“2>”和“3>”中的算符“#”意思單純,容易理解,彆扭的文法是“4>”。 “X2 = X1#todo{status=done}”在此表示的意思,似乎是: X2的值約束為類型是todo的記錄X1,並且只保留(提取)“status=done”這一項值。 這種文法形式,的確晦澀難懂,並且,沒有多少實用價值,甚至會有歧義。 “3>”已經確定了 X1 是 todo類型的記錄,並且已經有了不可更改的值,卻在“4>”中更改X1的定值,是不是有些自相矛盾? 我想,Erlang 自創的而非源自Prolog和List(FP)的文法,好像不太成功。 但是,從網上找了些資料看後,有了新認識。1、操作符 # 至少有 2 類共 4 種不同的含義和用法第一類是用於將不同基數制的數字轉換為十進位數,第二類是操作處理記錄(record)。第一種用法,# 是雙目運算子,將不同基數制的數字轉換為十進位數。如: 1> 2#111. %% 位元111轉換成十進位數 7 7 2> 8#111. %% 八位元111轉換成十進位數 73 73 3> 16#111. %% 十六進位數111轉換成十進位數 273 273第二種用法,# 是單目運算子,直接建立新記錄(record),不更改初始值。如: 2> X=#todo{}. #todo{status = reminder,who = joe,text = undefined} 第三種用法,# 是單目運算子,直接建立新記錄(record),並更改初始值。如: 3> X1 = #todo{status=urgent, text="Fix errata in book"}. #todo{status = urgent,who = joe,text = "Fix errata in book"} 第四種用法,# 是雙目運算子,以記錄的變數為藍本,建立記錄(record)並更改初始值。如: 4> X2 = X1#todo{status=done}. #todo{status = done,who = joe,text = "Fix errata in book"} 2、Erlang 記錄本身的特點(1)記錄是特殊的元組(tuple),即其自身及其成員都有名字的元組;(2)原始記錄是儲存在硬碟檔案中的,檔案的姓氏為“.hrl”,本身具有初始值。如: 檔案 records.hrl 中的內容為 -record(todo, {status=reminder,who=joe,text}).3、Erlang 函數調用必有值返回的特點 1> rr("records.hrl"). [todo] 函數 rr/1 返回一個列表,其中成員是原子(常量)todo,它代表一個記錄。 記錄 todo 現在記憶體中。4、操作符 # 用於建立記錄時的特點(1)# 操作符與且僅與記憶體中的某記錄,有必然聯絡;(2)#name{} 前無變數名時,它代表記憶體中的記錄name;(3)Var#name{},代表在變數Var中的記錄;(4)#name{status=done},元群組成員的值,用於替代記憶體記錄中已有的同名成員的值。5、Erlang 文法的函數編程特點Erlang 的文法,有 Prolog 華麗的外表,內裡卻是FP的骨肉。函數編程的本質特徵,是面向“值”,以“值”為中心。函數語言中的一切,幾乎全是“值”,變數、字串甚至函數本身,都可作為“值”來用。在函數調用、運算式應用等許多方面,往往見到或者隱含著“值”的出現。操作符 # 在處理記錄方面的應用,典型體現了 Erlang 的 FP 本性,值得關注琢磨。