感受 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 本性,值得关注琢磨。
看到这个标题,恐怕会让人觉得莫名其妙。其实我自个儿看着也不顺眼。
“个色”是北京话,大致是“独特”的意思。说一人“个色”,多半不是夸奖,而是贬损。
# 是 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 本性,值得关注琢磨。
相关文章推荐
- 感受 Erlang(4)
- Erlang接触的感受
- 感受 Erlang(1)
- 感受 Erlang(3)
- Erlang到底好在哪里 -- 聊聊我使用Erlang的经历与感受
- erlang中的命名空间(name spacing)
- Erlang不能错过的盛宴
- 培训质量好不好,学员的感受才是最有说服力的,【兄弟连战地日记】记录兄弟连学员真实的日常点滴。
- 网管感受
- 工作数年人的感受
- js操作json数据的一些感受
- 艾伟_转载:我对NHibernate的感受(2):何必到处都virtual
- LR的响应时间与使用IE所感受时间不一致的讨论(摘抄补充)
- erlang 源码安装
- 校园招聘的感受
- 从MySpace基于.NET平台的六次重构经历,来感受分布式系统。
- 使用target_system进行erlang应用的发行
- Cisco IOU 模拟器测试感受
- 在兄弟连的感受
- erlang 的源代码保护机制(经典)