zoukankan      html  css  js  c++  java
  • 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专题里面讲到。

  • 相关阅读:
    开源软件
    delphi 语法 点滴总结clientdataset
    combobox 下拉框 高度 调节 呵呵
    Delphi7中ClientDataSet的排序
    clientdataset 修改记录 成功
    http://bbs.csdn.net/topics/340046630 dbgrid怎么获取当前记录值
    Delphi中StrToDateTime函数TFormatSettings参数的使用
    IncSecond:将一个TDateTime变量加减一定数量的秒数
    clientdataset 做为 单机数据库的 使用 学习
    cmake命令用法整理list命令
  • 原文地址:https://www.cnblogs.com/pied/p/3635906.html
Copyright © 2011-2022 走看看