• Erlang学习记录(三)——表达式大集合


    Erlang中的表达式必须以.结束才会去执行。如果不加.你在编译环境下按多少次Enter,表达式都不会执行,表达式之间可以用,分隔,以.结尾后所有的表达式都会执行,但是只有最后一个以.结尾的表达式会在编译器中输出执行的结果。

    一.值是表达式

    任何类型的值都是表达式。如:

    1.
    3.5.
    true.

    二.计算表达式

    任何类型的值的计算是表达式。

    1.算术表达式

    +     正号
    -      负号
    +     加
    -     减
    *     乘
    /     浮点除
    bnot  按位求反  bnot (-12) = 11
    div    整除
    rem   求余
    band  &
    bor    |
    bxor  按位异或
    bsl    按位左移 2#11 bsl 1 = 2#110.
    bsr    按位右移 2#110 bsr 1 = 2#11.

    2.Boolean表达式

    not Expr
    Expr1 and Expr2       永远计算Expr2的值
    Expr1 andalso Expr2  如果Expr1为false,将不计算Expr2
    Expr1 or Expr2         永远计算Expr2的值
    Expr1 orelse Expr2    如果Expr1为true,将不计算Expr2
    Expr1 xor Expr2        异或

     3.List计算

    Expr1 ++ Expr2将Expr2加入Expr1中
    Expr1 -- Expr2将Expr2中的值从Expr1中删除

     注意:List计算是右结合的运算符,另外List计算很慢,慎用。

    4.运算符的优先级,从高到低:

    :     
    #     
    Unary + - bnot not     
    / * div rem band and
    + - bor bxor bsl bsr or xor
    ++ --
    == /= =< < >= > =:= =/=     
    andalso     
    orelse     
    = !    
    catch

    三.比较表达式

    值之间的比较是表达式,Erlang的比较运算符看起来有些奇怪:

    ==     ==
    /=      !=
    =<    <=
    <       <
    >=     >=
    >       >
    =:=     ===
    =/=     !==

    Erlang中的精度排序如下:

    number < atom < reference < fun < port < pid < tuple < list < bit string

    当不同类型的值进行比较时,低精度的将转换为高精度的进行比较。

    四.变量是表达式

    1.变量必须以大写字母或下划线打头,且能包含数字,下划线和@

    2.一个变量只能赋值一次。

    3._是一种特殊的匿名变量,它可以用在任何需要变量但不需要使用该变量的地方,如下例:

    [H|_] = [1,2,3]

    这里我们只需要获取第一个item的值,所以后面可以用_

    4.以下划线打头的变量和以大写字母打头的变量并不完全一样,以下划线打头的变量如果不被使用,不会产生warning,而以大写字母打头的变量会产生warning。

    五.模式匹配是表达式

    形如{X,Y}={1,2}即为模式匹配,做模式匹配要注意如下几点:

    1.格式要匹配,

     {A,B}=[1,2].将会抛出异常

    2.长度要匹配

    {A,B}={1,2,3}.或{A,B,C}={1,2}.将会抛出异常,对于不关注的字段可以用_来匹配,但是长度必须一致。

    3.数据要一致

    {A,1}={3,2}将抛出异常,必须用{A,1}={3,1}

    六.函数调用是表达式

    不管是直接调用函数,还是调用函数对象都是表达式。

    我们要注意不要定义和BIFs一样的函数,如果必须要定义和BIFs一样的函数。如定义length函数,则需要将-compile({no_auto_import,[length/1]}).加入module定义中。

    七.If表达式

    if
        GuardSeq1 ->
            Body1;
        ...;
        GuardSeqN ->
            BodyN
    end

     注意,If表达式必须要获得一个匹配,否则会抛出异常,所以一般可以将true做为最后一个guard expression。

    八.Case表达式

    case Expr of
        Pattern1 [when GuardSeq1] ->
            Body1;
        ...;
        PatternN [when GuardSeqN] ->
            BodyN
    end

    与If相比,Case更为强大,它不仅能进行条件判断,还能利用各种模式。Case表达式也必须获得一个匹配,否则会抛出异常,所以一般最后用_Else做一个通用匹配。

    九.Send表达式

    Expr1 ! Expr2

    Erlang的彪悍全体现在这里了,很简单,很强大的一个表达式啊。

    这里的Expr1可以是一个process identifier(进行进程通信),可以是一个分布式的地址表示{Name,Node}(分布式通信),也可以是一个普通的name,总之对于任何一种接收信息的对象,任何一种信息,一个简单的!就把信息传出去了,够强大吧!

     十.Receive表达式

    receive
        Pattern1 [when GuardSeq1] ->
            Body1;
        ...;
        PatternN [when GuardSeqN] ->
            BodyN
    end

    形式类似于Case表达式,但是Receive表达式永远都不会报错,当信息到达时,如果信息能够被匹配,将会被处理,并从消息列表中移除。而接收到其他不匹配的信息也不会报错,只是会继续保存在消息列表中。当你调用Receive时,Receive会一直等待,直到一个能够匹配其中模式的信息到达。

    为了避免消息等待时间过长,Receive引入了timeout机制:

    receive
        Pattern1 [when GuardSeq1] ->
            Body1;
        ...;
        PatternN [when GuardSeqN] ->
            BodyN
    after
        ExprT ->
            BodyT
    end

    Receive将在ExprT表示的时间达到后退出,若ExprT为infinity则会一直等待。

     十一. Begin...End表达式

    begin
       Expr1,
       ...,
       ExprN
    end

    暂时没觉得这个表达式有啥用。

    十二. Try,Catch,Throw

    这个之后介绍啦

  • 相关阅读:
    做了半年的答题小程序上线了
    党建答题助手小程序
    党建答题活动小程序
    微信答题活动小程序
    微信答题活动小程序
    如何搭建在线考试小程序
    如何搭建在线考试小程序
    基于云开发的在线答题小程序
    XLua访问C#中的List或者数组
    字符串、字节数组、流之间的相互转换以及文件MD5的计算
  • 原文地址:https://www.cnblogs.com/studynote/p/3219023.html
Copyright © 2020-2023  润新知