erlang学习笔记:语法基础

模式匹配
=表示一个模式匹配操作。Lhs=Rhs实际上是这样一个过程,对右端求值(Rhs),然后将结果与左端(Lhs)进行模式匹配。


变量
   绑定变量:一个指针,指向存放那个值的存储区,而那个值是无法改变的。






运算符


除法:
  / 保留小数
  div 整除
  rem 求余
  


原子
用来表示不同的非数字常量值
erlang中的原子时全局有效的,而且无需使用宏定义或者包含文件。
原子是一串以小写字母开头,后跟数字字母或下划线或邮件符号的字符。
使用单引号引起来的字符也是原子。


元组
一定数量的项组成单一的实体。
将若干个以逗号分割的值用一对花括号括起来,形成元组。
通常可以使用一个原子作为元组的第一个元素来标明这个元组所代表的含义。


实例:
Person={
    person,
    {name,jack},
    {age,18},
    {sex,boy}
}.


声明元组时,就自动创建了元组,不再使用它们时,元组也随之销毁。erlang使用垃圾搜集器去收回没有使用的内存,因此我们不用担心内存分配的问题。
如果创建的一个元组引用了一个已绑定的变量,那么新元组将会享有这个变量所引用的数据结构。


实例:
F={firstName,joe}.


L={lastName,tom}.


P={F,L}.






列表
   用列表存储数目可变的东西。将若干个以逗号分割的值用一对方括号括起来,就形成了一个列表。
  
   列表的第一个元素称为列表的头,剩下的东西称为列表的尾。列表的尾通常还是一个列表。


   访问列表的投射一个非常高效的操作,因此,实际上所有列表处理函数都是从提取列表头开始的,先对头进行处理,然后继续处理列表的尾。




定义列表
   如果T是一个列表,那么[H|T]也是一个列表。这个列表以H为头,以T为尾。竖线符号可以将列表的头和尾分隔开来,而[]则是空列表。  


字符串
   严格地讲,erlang中并没有字符串,字符串实际上就是一个整数列表。用双引号('')将一串字符括起来就是一个字符串。
   Name="Hello".   
   这里的"Hello"仅仅是一个速记形式,实际上它意味着一个整数列表。列表中的每一个元素都有相应的字符的整数值。[ASCII码]


   shell打印一串列表值时,只有列表中的所有整数都是可打印字符,它才把这个列表当作字符串来打印。


   可以使用$符号来表示字符的整数值。例如,$a实际上是一个整数,表示字符a。


   


f() 会让shell释放它绑定过的所有变量。执行这个命令后,所有的变量都变成自由变量。




模块
   模块是erlang中代码的基本单元,我们编写的所有函数都存于模块之中。模块文件通常存放在以.erl为扩展名的文件中。
   要运行一个模块,首先需要编译它,编译成功之后模块文件其扩展名是.beam。
   


geometry.erl


-module(geometry).
-export([area/1]).
area({rectangle,Width,Ht})  ->Width*Ht;
area({circle,R}) ->3.14159*R*R.


编译:
c(geometry).
//编译并加载


调用:
geometry:area({rectangle,10,5}).


  子句的顺序并不重要,无论这些子句的顺序如何,对于程序来说,运行的效果都是一样的。因为各子句的模式彼此互不相干。这使编写和扩展程序变得很简单,只须添加新的模式就行了。不过,通常来说子句的顺序还是有点关系的,因为进入一个函数的时候,调用是按照模式在文件中的顺序依次进行匹配的。
注意:
1.area函数由若干个不同的子句构成。当调用这个函数时候,对其调用参数的匹配过程从第一个子句开始依次向下进行。
2.函数不能处理模式匹配失败的情形,此时程序会失败并抛出一个运行时错误。这一点是故意为之。


area函数友两个子句构成,子句间以分号分隔,最后一条子句的后面以句点作为结束符。每一个子句都有一个函数头和一个函数体,函数头由函数名合 随后的以括号括起来的模式组成,函数体则由一系列表达式组成,如果函数头中的模式与调用参数匹配成功的话,其对应的表达式就会进行运算。模式将按照它们出现在函数定义中的先后顺序进行匹配。   


购物清单


shop.erl


-module(shop).
-export([cost/1]).


cost(oranges)  ->5;
cost(newspaper) ->8;
cost(apples) ->2;


函数cost/1由5个子句组成,每个子句的头部都包括了一个模式(本例之中的模式非常简单,只是一个原子而已)。当我们对shop:cost(X) 求值时,系统会用X对这些子句的每一个模式进行匹配。如果匹配了某个模式,那么紧跟在->之后的代码就会执行。
cost/1函数必须从模块之中导出,如果你想从模块的外部调用它,这是必须的。
cost(pears) ->9;
cost(milk) ->7.


shop1.erl


-module(shop1).
-export([total/1]).


total([{What,N}|T]) ->shop:cost(What)*N
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值