`

Erlang入门(五)——补遗

阅读更多
暂时搞不到《Programming Erlang》,最近就一直在看Erlang自带的例子和Reference Manual。基础语法方面有一些过去遗漏或者没有注意的,断断续续仅记于此。

1。Erlang的保留字有:

after and andalso band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse query receive rem try when xor<!---->

基本都是些用于逻辑运算、位运算以及特殊表达式的符号

2.Erlang的类型,除了在前面入门一提到的类型外,还包括:
1)Binary,用于表示某段未知类型的内存区域
比如:
1> <<10,20>>.
<<10,20>>
2> <<"ABC">>.
 <<65,66,67>>

2)Reference,通过调用mk_ref/0产生的运行时的unique term

3)String,字符串,Erlang中的字符串用双引号包括起来,其实也是list。编译时期,两个邻近的字符串将被连接起来,比如"string" "42" 等价于 "string42"

4)Record,记录类型,与c语言中的struct类似,模块可以通过-record属性声明,比如:
-module(person).
-export([new/2]).
-record(person, {name, age}).
new(Name, Age) ->
     #person{name=Name, age=Age}.
1> person:new(dennis, 44).
{person,dennis,44}
 在编译后其实已经被转化为tuple。可以通过Name#person.name来访问Name Record的name属性。

3.模块的预定义属性
-module(Module).    声明模块名称,必须与文件名相同
-export(Functions).   指定向外界导出的函数列表
-import(Module,Functions).   引入函数,引入的函数可以被当作本地定义的函数使用
-compile(Options).     设置编译选项,比如export_all
-vsn(Vsn).         模块版本,设置了此项,可以通过beam_lib:version/1 获取此项信息
可以通过-include和-include_lib来包含文件,两者的区别是include-lib不能通过绝对路径查找文件,而是在你当前Erlang的lib目录进行查找。

4.try表达式,try表达式可以与catch结合使用,比如:
try Expr
catch
throw:Term -> Term;
exit:Reason -> {'EXIT',Reason}
error:Reason -> {'EXIT',{Reason,erlang:get_stacktrace()}}
end

不仅如此,try还可以与after结合使用,类似java中的try..finally,用于进行清除作用,比如:
termize_file(Name) ->
{ok,F} = file:open(Name, [read,binary]),
try
{ok,Bin} = file:read(F, 1024*1024),
binary_to_term(Bin)
after
file:close(F)
end.


5.列表推断(List Comprehensions),函数式语言特性之一,Erlang中的语法类似:
[Expr || Qualifier1,...,QualifierN]
Expr可以是任意的表达式,而Qualifier是generator或者filter。还是各举例子说明下。
1> [X*2 || X <- [1,2,3]].
[2,4,6]

2> L=[1,2,3,4,5,6,7].
[1,2,3,4,5,6,7]

3> [X|X<-L,X>=3].
[3,4,5,6,7]

再看几个比较酷的例子,来自Programming Erlang
比如快速排序
-module(qsort).
-export([qsort/1]).
qsort([])->[];
qsort([Pivot|T])->
  qsort([X||X<-T,X


6.宏,定义常量或者函数等等,语法如下:
-define(Const, Replacement).
-define(Func(Var1,...,VarN), Replacement).

使用的时候在宏名前加个问号?,比如?Const,Replacement将插入宏出现的位置。系统预定义了一些宏:
?MODULE 表示当前模块名

?MODULE_STRING 同上,但是以字符串形式
?FILE 当前模块的文件名
?LINE 调用的当前代码行数
?MACHINE 机器名

Erlang的宏与C语言的宏很相似,同样有宏指示符,包括:
-undef(Macro).
取消宏定义
-ifdef(Macro).
当宏Macro有定义的时候,执行以下代码
-ifndef(Macro).
同上,反之
-else.
接在ifdef或者ifndef之后,表示不满足前者条件时执行以下代码

-endif.
if终止符
假设宏-define(Square(X),X*X).用于计算平方,那么??X将返回X表达式的字符串形式,类似C语言中#arg

一个简单的宏例子:
ruby 代码
 
  1. -module(macros_demo).  
  2. -ifdef(debug).  
  3. -define(LOG(X), io:format("{~p,~p}: ~p~n", [?MODULE,?LINE,X])).  
  4. -else.  
  5. -define(LOG(X), true).  
  6. -endif.  
  7. -define(Square(X),X*X).  
  8. -compile(export_all).  
  9. test()->  
  10.     A=3,  
  11.     ?LOG(A),  
  12.     B=?Square(A),  
  13.     io:format("square(~w) is ~w~n",[A,B]).  

当编译时不开启debug选项的时候:
17> c(macros_demo).
{ok,macros_demo}
18> macros_demo:test().
square(3) is 9

当编译时开启debug之后:

19> c(macros_demo,{d,debug}).
{ok,macros_demo}
20> macros_demo:test().
{macros_demo,11}: 3
square(3) is 9
ok

可以看到LOG的输出了,行数、模块名以及参数

7、Process Dictionary,每个进程都有自己的process dictionary,用于存储这个进程内的全局变量,可以通过下列
BIFs操作:
put(Key, Value)
get(Key)
get()
get_keys(Value)
erase(Key)
erase()

8、关于分布式编程,需要补充的几点
1)节点之间的连接默认是transitive,也就是当节点A连接了节点B,节点B连接了节点C,那么节点A也与节点C互相连接
可以通过启动节点时指定参数-connect_all false来取消默认行为

2)隐藏节点,某些情况下,你希望连接一个节点而不去连接其他节点,你可以通过在节点启动时指定-hidden选项
来启动一个hidden node。在此情况下,通过nodes()查看所有连接的节点将不会出现隐藏的节点,想看到隐藏的节点
可以通过nodes(hidden)或者nodes(connected)来查看。

完整的erl选项如下:

-connect_all false 上面已经解释。
-hidden 启动一个hidden node
-name Name 启动一个系统成为节点,使用long name.
-setcookie Cookie Erlang:set_cookie(node(), Cookie).相同,设置magic cookie
-sname Name 启动一个Erlang系统作为节点,使用short name


注意,short name启动的节点是无法与long name节点通信的

.一个小细节,在Erlang中小于等于是用=<表示,而不是一般语言中的<=语法,我犯过错误的地方,同样,不等于都是用/号,而不是
!,比如/=、=/=。

10.and or 和andalso orelse的区别

and和or会计算两边的表达式,而andalso和orelse的求值采用短路机制,比如exp1 andalso exp2,当exp1返回false之后,就不会去求值
exp2,而是直接返回false,而exp1 and exp2会对exp1和exp2都进行求值,or与orelse也类似。

今天在erlang-china下到了《Programming Erlang》,准备打印一份看看,进入OTP的学习。

分享到:
评论
2 楼 dennis_zane 2010-08-25  
不用了,这书早就读完了,多谢。
1 楼 fire9 2010-08-25  
你多久能看完,要不我先借给你看。

相关推荐

    Erlang入门

    **Erlang入门** Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson在1986年开发,主要用于构建高度可靠和可扩展的分布式系统。这本书"Introducing Erlang"引领读者踏入这个独特的编程世界,...

    erlang入门学习经典资料(很不错)

    ### Erlang 入门学习经典资料解析 #### Erlang 的神秘与起源 Erlang,作为一门相对小众但极具特色的编程语言,自问世以来便伴随着一种神秘的气息。这种神秘感不仅源于它独特的编程范式——函数式编程,还在于其...

    icerlpcap:Erlang PCAP NIF——仅用于测试目的

    冰帽原作者:徐明勇( ) 这是 erlang PCAP NIF。 目前在 win7-8 和 WinPcap 4.1.2 上支持 erlang/x64。 警告:NIF 无效,并且会阻止 erlang VM。 为了获得更好的性能,请使用 epcap -- erlang 端口接口用于 PCAP: ...

    erlang开发入门教程

    erlang是爱立信开发的程序开发语言,融合了函数式编程与面向对象编程,并行处理内建与程序语言内部,特别适合创建并发行、容错性、分布性要求比较高的软实时系统,掌握它程序员必备的一种编程技能,与它相似的语言...

    Erlang入门:构建application练习5(监督树)

    在这个"Erlang入门:构建application练习5(监督树)"中,我们将探讨如何构建一个包含监督树的应用,这是Erlang OTP(开放电信平台)设计模式中的核心部分。 监督树是Erlang OTP设计原则的重要组成部分,它用于管理...

    erlang入门级练习:LeetCode OJ问题的部分erlang 源码

    我自己在新学erlang,在LeetCode OJ上找了题目练习,题目很适合新手熟悉语言,但是LeetCode OJ里面只有几门主流语言的答案,下面是已完成的erlang源代码,后续有空再做其他问题续传,题目包含:(源码开头都有题目...

    Erlang入门:构建application练习2

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,用于构建高可用性、分布式和实时系统。在本教程中,我们将深入探讨如何使用Erlang构建一个名为"Application"的基本应用程序,这在...

    erlang 入门练习

    本文将通过"erlang 入门练习"的案例,探讨Erlang的基础知识和应用。 首先,让我们从`client.erl`这个文件名入手。在Erlang中,`.erl`文件是源代码文件,包含了Erlang的模块定义和函数实现。`client`可能表示一个...

    Erlang入门ppt

    这份名为"Erlang入门ppt"的资料是英文版的,但提供了深入理解Erlang语言的基础。 在20世纪90年代初,软件项目成功率低、大型项目失败率高是一个普遍问题。研究指出,16%的软件项目成功,53%虽然运行但未达到预期,...

    Erlang入门:构建application练习4(进程link的作用)

    在Erlang编程语言中,进程是其核心特性之一,它们是并发执行的实体,类似于其他语言中的线程。在Erlang中,进程间通信(IPC)是通过消息传递来实现的,而`link`机制是这个通信模型中非常重要的一部分。本教程将通过...

    Erlang初级入门(英文pdf)

    #### 五、Erlang的特点 - **声明式编程**:Erlang采用了函数式编程的范式,强调数据流和变换而不是指令控制。 - **并发性**:Erlang的设计使得编写高度并发的应用程序变得容易。 - **软实时**:能够支持实时应用,...

    erlang程序设计与入门

    **Erlang程序设计与入门** Erlang是一种并发、函数式编程语言,主要用于构建分布式、高可用性、容错性强的系统。它的设计灵感来源于电信行业的需求,由瑞典爱立信公司于1986年开发。Erlang以其独特的并发模型、轻量...

    erlang资源

    这个“erlang资源”包含两本PDF书籍——《Erlang并发编程》和《Erlang入门手册》,它们是深入理解和学习Erlang语言的关键资料。 《Erlang并发编程》这本书可能涵盖了以下知识点: 1. **并发模型**:Erlang的并发...

    erlang编程指南

    erlang编程语言圣经 erlang从业人员的必备书籍 erlang语言开发入门

    erlang——Mnesia用户手册.pdf

    目.录 1、介绍 1.1.关于.Mnesia 1.2.Mnesia.... 2、开始.Mnesia ...3、构建.Mnesia....5、其它.Mnesia....5.7.Mnesia....5.8.调试.Mnesia....5.9.Mnesia....5.11.Mnesia....6.Mnesia....7.Mnsia....7.1.结合.Mnesia....8.附录.A:Mnesia....

Global site tag (gtag.js) - Google Analytics