Erlang第一课----基本变量
1、(in Erlang shell)A sequence of expressions must be terminated with a period followed by whitespace; otherwise, it won't be executed. You can separate expressions with commas, but only the result of the last one will be shown.
2、Erlang shell中调试程序时,如果job僵掉了,可以用ctrl+G-> i -> c中断僵掉的job并连接到第一个job(这里不确定是第一个还是最后一个,待进一步确认)。ctrl+G进入任务管理器后,h是打印帮助菜单。
3、变量名第一个字母必须是大写;或者以下面线(_)开始,但是一般用来标示这个变量只是写来看的,我们后面不会再用,即don't care one。
4、变量不能进行第二次赋值,除非是赋同一个值。更准确来说,并不能说这是赋值,应该叫bound,即绑定;所以,我们完全可以把这里的Variable当做是别名,而且是被element唯一拥有的。
ps:在shell中,如果你给某个变量赋错了值,你可以使用f(Variable).来对其进行擦除;使用f().,即不带参数时,表示擦除所有变量。另外,该flush函数只有在shell中有。
ps: 还有这些也是常用的:1)h(). 用来打印最近的20条历史命令。2)b(). 查看所有绑定的变量。3) e(n). 执行第n条历史命令。4) e(-1). 执行上一条shell命令
5、变量命名不能以小写开始的原因是,还有另外一种类型的数据叫atom。每个atom关联了一个atom table,atom table在32为系统中占用4bytes内存,在64位系统中占用8个bytes内存;如果不是内存被用光或者是atoms的数量达到1048577,这些内存是不会被回收的,直到程序结束。
ps: 这些atom是保留的:
ps: 本质上,atom是实现了一个类似hash table的机制;atom的name其实是atom table的别名,可以当做是hash table里的key。(个人理解,待验证)
6、bool运算符and,or,xor,not等几个是双目运算符,会取出运算符两边的对象进行操作。andalso和orelse是单目运算符,只考虑右边的操作对象。
7、比较运算符有全等(=:=), 不全等(=/=),值相等(==),值不相等(/=);另外还有大于(>),小于(<),大于等于(>=),小于等于(=<)。
ps:唔,这里有个神奇的概念,至少从c/c++过来会觉得它神奇,以下比较是可以实现的:number < atom < reference < fun < port < pid < tuple < list < bit string. 所以,我们可以进行比较1(number)<false(atom),比较结果是true;而0(number) == false(atom)是错的,在Erlang里面,false并不代表一个数值。
8、tuples不知道该翻译成什么好,元组?数组?它是个和数组类似的存在,不过,它的元不仅仅是number而已。事实上,它的元可以是Erlang支持的任一类型。
9、我们可以这样取出一个tuple里的元素,这个是Erlang里面很重要的一个概念,叫patten matching:
> PreciseTemp={celsius, 23.213}. {celsius,23.213} >{celsius,T}=PreciseTemp. {celsius,23.213} > T=T. 23.213
上面这种包含一个atom,然后跟着一个元素的tuple叫做tagged tuple。 同时,在patten matching时,我们可以用通配符“_”来忽略相应位置上的元素:
> PreciseTemp={celsius, 23.213}. {celsius,23.213} >{_,T}=PreciseTemp. {celsius,23.213} > T=T. 23.213
如此,我们忽略了celsius这一atom,使其变成了the don't care one。此外,正如上面第3点描述,我们可以把这个被忽略的变量写成“_ignored”, 或者"_babycat", 或者“_trashed”都行;反正以下划线开始,就已经表示它被放弃了。
10、lists可能翻译成列表更确切。lists是由一系列的cons cells组成的,这是它与tuples的最大区别。这里的cons 其实就是constructor。
我们用一个较为形象的例子说明。比如,一个lists p = [1,2,3],事实上,是由以下一个步骤构建的:
p1 = [1, p2] p2 = [2, p3] p3 = [3, p_to_empty_list]
p = p1
或者,换一种方式,我们用cons operator “|”(也就是前面讲的constructor)来描述这一过程:
p = [1 | [2 | [3]]].
11、lists是可以做“加法”和“减法”的,用“++”和"--"。
> [1,2,3,4,5]--[3,4]. [1,2,5] > [1,2,5]++[6,7]. [1,2,5,6,7]
12、我们在tuples里面用到的patten match在lists中同样适用:
>NewList=[1,2,3,4]. [1,2,3,4] > [Head|Tail]=NewList. [1,2,3,4] > Head=Head. 1 > Tail=Tail . [2,3,4]
13、lists comprehension是类似集合定义的一个存在,下面两个例子比较典型:
> [X+Y || X <-[1,2], Y<-[3,4]]. [4,5,5,6] > Weather=[{toronto,rain},{montreal, storms},{london, fog},{paris,sun},{boston,fog},{vancouver,snow}]. [{toronto,rain}, {montreal,storms}, {london,fog}, {paris,sun}, {boston,fog}, {vancouver,snow}] > FoggyPlaces=[X||{X,fog}<-Weather]. [london,boston]
我们定义{Z=X+Y:X∈{1,2},Y∈{3,4}},然后罗列出Z。不过,这里把“:”换成了“||”,然后把“∈”换成了“<-”;这里,我们不妨把“<-”当做是“=”来看。另一个例子也是类似。
14、Erlang 中并没有字符串类型,如果list的每个element都是在Latin-1(ISO-8859-1)中的,那么,模拟器就会把他打印出来;如果有任何成员不是可打印的,会当做一般list对待。比如
> [97,98,99]. "abc" > [97,98,99,4,3]. [97,98,99,4,3]
> I= $s.
115
这Erlang中,$符号用来取字符的ASCII码值。
Erlang最初的设计几乎没考虑过要处理字符串,所以,字符串处理比较困难,是把它应用到非通信设备领域的重要障碍。但是,实际应用中,不使用字符串又是不可能的。这种情况下,“能实现”可能是更实际的要求,所以也就有了使用lists(链表)这样的结构来操作字符串的应用;相对而言,binary string可能比lists更加的适合操作字符串,它的结构更接近C里面的array,或者C++里面的string,会在下一课binary专题里面讲到。