Erlang第一课----基本变量

时间:2023-01-06 20:04:48

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专题里面讲到。