您的位置:首页 > 其它

感受 Erlang(2)

2008-11-29 15:37 211 查看
个色的 #
看到这个标题,恐怕会让人觉得莫名其妙。其实我自个儿看着也不顺眼。
“个色”是北京话,大致是“独特”的意思。说一人“个色”,多半不是夸奖,而是贬损。
# 是 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 本性,值得关注琢磨。
        
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: