Erlang(3):数据类型与变量

1.初步尝试控制台的操作。输入
1> a = 20
结果没反应。。。
后来发现erlang的语句是以.号来结尾的。改改:
1> a = 20.
** exception error: no match of right hand side value 20
报错了,与右边的值不匹配。在研究一下。
erlang变量必须以大写字母或者下划线开头。
例如:
2> A = 20.
20
=是模式匹配符,变量只能一次性赋值。
这个情况下,有点像C++里面的常量。而=就像C++里面的==了。
22> A = 20. %首次匹配,将A绑定为20
20
23> A = 20. %再次将A匹配20,是相等的,输出了表达式的值20.
20
24> X = 1234. %首次匹配,将B绑定为1234.
1234
25> X = 1235. %再次匹配,匹配不上,就报错了。
** exception error: no match of right hand side value 1235

2.注释,%末尾后面的都是注释

3.几个shell编辑命令
ctrl + a 将光标移动到行首
ctrl + d 删除光标当前字符,在行尾等待输入的时候,是无法删除字符的
ctrl + e 将光标移动到行尾
ctrl + f或右箭头 将光标向前一个字符
ctrl + b或左箭头 将光标向后一个字符
ctrl + p或上箭头 切换到上一条shell语句
ctrl + n或下箭头 切换到下一条shell语句
ctrl + t 调换光标附近的两个字符
Tab 尝试扩展当前模块或函数名称。
这些都是亲自测试过的了。

4.算数表达式
8> 1 + 2 * 3 + 4.
11
遵循算数表达式的一般规则。
10> 123456789 * 123456789 * 999999999.
15241578734948942249809479
Erlang可以使用任意长度的整数,不用担心溢出。


5.8进制和16进制
18> 8#1234567.
342391
19> 16#123abc.
1194684
在使用数字的时候,在前面加上8#和16#
试了一下11#、123#这些也是行的。看来理论上是支持任意进制的运算。


6.浮点数
两个整数相除,得出的是浮点数。
34> 4/2.
2.0
要想得到C++里面的整除和求余的效果。
31> 5 div 3.
1
32> 5 rem 3.
2
div是整除,rem是求余。
%已经被用来做注释了。
erlang的浮点数,也会存在精度问题。


7.原子
有点像C++的字符串常量。
原子必须以小写字母开头,或者用单引号包着。
原子的值就是它本身
35> hello world.
* 1: syntax error before: world
35> hello.
hello
36> 'hello world'.
'hello world'
不用''包着的情况下,是不能用空格的。


8.元组
把一些数量固定的项目组合成单一的实体,叫做元组(tuple)。
例如:{fable, 171}
有点想C++的结构。但是元组是匿名的。所以我觉得,更加像C++11出现的初始化列表。
为了增加可读性,一般将一个具有注释性意义的原子作为元组的第一个元素。
例如点{123,456}
改为{point,123,456}
元组是可以嵌套的。


9.提取元组的值
这里需要用到=,真正意义上的模式匹配
例如:
1> Point = {point, 10, 45}.
{point,10,45}
2> {point, X, Y} = Point.
{point,10,45}
3> X.
10
4> Y.
45
注意的是,如果X和Y上面之前已经用过了,就会匹配不上的。
只有首次匹配,才能抽取元组中的值。
可以使用_来作为占位符,表示不感兴趣的变量,成为匿名变量,同一个模式里面可以有多个。
例如上面只抽取X:{_, X, _} = Point.


10.列表(list)用来存放任意数量的事物,使用[]。
列表的第一个元素为表头(head),剩下的成为表尾(tail)。
如果T是一个列表,[H|T]也是一个列表,它的头是H,尾是T。竖线(|)把列表的头与尾分开。[]是一个空列表。
如果有一个非空列表L,通过[X|Y] = L会提取列表头作为X,列表尾作为Y。


11.字符串
严格来说Erlang里没有字符串。字符串实际是是一个整数列表。每个字符对于列表里一个Unicode代码点(codepoint)。
可以使用字符串字面量来创建一个列表。字符串字面量(string literal)用双引号包着。
5> H = "Hello World, Fable.".
"Hello World, Fable."
如果打印列表的时候,列表内所有整数都代表可打印字符,就会自动打印成字符串字面量。
6> [83,117,114,112,114,105,115,101].
"Surprise"
7> [1,83,117,114,112,114,105,115,101].
[1,83,117,114,112,114,105,115,101]
1不是可打印字符,加上之后就不能自动转换了。
使用$可以打印出某个字符的整数。
9> $1.
49
10> $a.
97

12.f()命令可以让当前的所有绑定都解除。

总结一下:

数据类型 Erlang C++
整形 无限制 有最大值限制
浮点型 有精度限制 有精度限制
字符串 使用数字来表示 使用字符数组
复合类型 元组,列表 结构和类,数组
因为对erlang的认识还不够深入,所以只能勉强比较。

其实学一门新的语言的时候,不应该无时无刻想着对之前掌握的语言进行对比,想着哪里好用,哪里不好用。

只是这些对照,可以对原来的语言,计算机的基础,以及编译器有更多的认识。

这些都要靠自己去把握了。



posted @ 2017-01-14 12:11  肥宝游戏  阅读(357)  评论(0编辑  收藏  举报