erlang的基本语法

来源:互联网 发布:传奇db数据库详解 编辑:程序博客网 时间:2024/05/16 13:42

1、变量
1)erlang变量变量必须以大写字母或者下划线开头,可以包含字母、下划线和@;
2)变量只容许赋值一次
2、数字类型
    1)B#Val表示以B进制存储的数字Val,比如
        7> 2#101.
        5
        二进制存储的101就是10进制的5了
        8> 8#101.
        65
        八进制存储的101就是10进制的65了
    2)$Char表示字符Char的ascii编码,比如$A表示65
3、atom
    可以理解成常量,它可以包含任何字符,以小写字母开头,如果不是以小写字母开头或者是字母之外的符号,需要用单引号包括起来,比如abc,'AB'
4、Tuple,元组,可以理解成定长数组,是Erlang的基础数据结构之一:
8> {1,2,3,4,5}.
{1,2,3,4,5}
9> {a,b,c,1,2}.
{a,b,c,1,2}
10> size({1,2,3,a,b,c}).
6
5、list
另外一个基础数据结构就是各个语言都有的list(列表),在[]内以,隔开,可以动态改变大小,
    [123, xyz]
    [123, def, abc]
    [{person, 'Joe', 'Armstrong'},
        {person, 'Robert', 'Virding'},
        {person, 'Mike', 'Williams'}
    ]
可以使用内置函数length求列表大小。

6、Erlang中函数的定义必须在一个模块内(Module),并且模块和函数的名称都必须是atom,函数的参数可以是任何的Erlang类型或者数据结构,函数要被调用需要从模块中导出,函数调用的形式类似:moduleName:funcName(Arg1,Arg2,...).

7、内置的常用函数:
    date()
    time()
    length([1,2,3,4,5])
    size({a,b,c})
    atom_to_list(an_atom)
    list_to_tuple([1,2,3,4])
    integer_to_list(2234)
    tuple_to_list({})
    hd([1,2,3,4])  %输出1,也就是列表的head,类似Lisp的car
    tl([1,2,3,4])  %输出[2,3,4],也就是列表的tail,类似List的cdr

8、常见Shell命令:
1)h(). 用来打印最近的20条历史命令
2)b(). 查看所有绑定的变量
3) f(). 取消(遗忘)所有绑定的变量。
4) f(Val).  取消指定的绑定变量
5) e(n).   执行第n条历史命令
6) e(-1).  执行上一条shell命令

9、apply函数,它的调用方式如下:
apply(Mod, Func, Args),三个参数分别是模块、函数以及参数列表,比如调用我们的第一个Erlang程序:
apply(helloWorld,run,[dennis]).

10、Guard,用于限制变量的类型和范围,比如:
     number(X)    - X 是数字
    integer(X)    - X 是整数
    float(X)    - X 是浮点数
    atom(X)        - X 是一个atom
    tuple(X)    - X 是一个元组
    list(X)        - X 是一个列表
  
    length(X) == 3    - X 是一个长度为3的列表
    size(X) == 2    - X 是一个长度为2的元组
  
    X > Y + Z    - X >Y+Z
    X == Y        - X 与Y相等
    X =:= Y        - X 全等于Y
    (比如: 1 == 1.0 成功
               1 =:= 1.0 失败)
为了方便比较,Erlang规定如下的比较顺序:
number < atom < reference < port < pid < tuple < list
其中pid就是process的id。

11、if和case语句
if语句的结构如下:
if
   Guard1 ->
        Sequence1 ;
   Guard2 ->
        Sequence2 ;
...
end
而case语句的结构如下:

case Expr of
Pattern1 [when Guard1] -> Seq1;
Pattern2 [when Guard2] -> Seq2;

PatternN [when GuardN] -> SeqN
end
if和case语句都有一个问题,就是当没有模式匹配或者Grard都是false的时候会导致error,
通过_指代任意的Expr,返回true,而if可以这样:
if
  true ->
   true
end
一样的道理。case语句另一个需要注意的问题就是变量范围,每个case分支中定义的变量都将默认导出case语句,也就是在case语句结束后可以被引用,因此一个规则就是每个case分支定义的变量应该一致,不然算是非法的,编译器会给出警告,比如:
f(X) ->
case g(X) of
true -> A = h(X), B = A + 7;
false -> B = 6
end,
h(A).

如果执行true分支,变量A和变量B都被定义,而如果执行的false分支,只有变量B被定义,可在case语句执行后,h(A)调用了变量A,这是不安全的,因为变量A完全可能没有被定义,编译器将给出警告
variable 'A' unsafe in 'case' (line 10)
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(2565) | 评论(0) | 转发(0) |
0

上一篇:erlang语言编辑环境的搭建

下一篇:erlang中如何调试程序?

相关热门文章
  • APP开发流程,你知道多少...
  • c++几种类型转换的相关介绍...
  • Linux设备驱动程序学习(20)-...
  • QEMU源码分析系列(三) ...
  • gdb的基本工作原理是什么?...
  • jsp problem
  • OpenBSD系统的文件布局[转]...
  • 送给FreeBSD和UNIX的初学者...
  • Tmux使用初体验
  • emacs最简单入门,只要10分钟...
  • linux dhcp peizhi roc
  • 关于Unix文件的软链接
  • 求教这个命令什么意思,我是新...
  • sed -e "/grep/d" 是什么意思...
  • 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
原创粉丝点击