`
hideto
  • 浏览: 2666453 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Programming Erlang读书笔记3: Sequential Programming

阅读更多
module是Erlang代码的基本单元,我们写的所有function都存储在module里面,module存储在.erl文件里面
module编译成.beam文件后方可运行

在Erlang_HOME建立一个名为.erlang的文件:
io:format("consulting .erlang in ~p~n", [element(2, file:get_cwd())]).
%% Edit to the directory where you store your code
c:cd("C:/Program Files/erl5.6/work").
io:format("Now in:~p~n", [element(2, file:get_cwd())]).

这样启动Erlang自带的Windows程序时会自动切换到work目录

funs是匿名方法:
1> Z = fun(X) -> 2*X end.
2> TempConvert = fun({c, C}) -> {f, 32 + C*9/5};
                    ({f, F}) -> {c, (F-32)*5/9}
                 end.


返回funs的方法和可以接受funs作为参数的方法被称为higher-order方法
接受funs作为参数的方法:
1> L = [1,2,3,4].
[1,2,3,4]
2> lists:map(Double, L).
[2,4,6,8]
3> lists:filter(Even, L).
[2,4]

返回funs的方法:
1>Fruit = [apple, pear, orange].
[apple, pear, orange]
2> MakeTest = fun(L) -> (fun(X) -> lists:member(X, L) end) end.
#Fun<erl_eval.6.56006484>
3> IsFruit = MakeTest(Fruit).
#Fun<erl_eval.6.56006484>
4> IsFruit(pear).
true
5> IsFruit(dog).
false
6> lists:fitler(IsFruit, [dog, orange, cat, apple, bear]).
[orange, apple]


Erlang没有for循环,但我们可以自己定义一个:
for(Max, Max, F) -> [F(Max)];
for(I, Max, F) -> [F(I)|for(I+1, Max, F)].

1> lib_misc:for(1,10,fun(I) -> I end).
[1,2,3,4,5,6,7,8,9,10]


module用来声明本module名
export用来导出本module的公开方法
import用来导入其它module的公开方法

使用List Comprehension([F(X) || X <- L])来简化编程和增加可读性:
1> L = [1,2,3,4,5].
[1,2,3,4,5]
2> lists:map(fun(X) -> 2*X end, L).
[2,4,6,8,10]
3>[2*X || X <- L].
[2,4,6,8,10]


用List Comprehension实现Quicksort:
qsort([]) -> [];
qsort([Pivot|T]) ->
    qsort([X || X <- T, X < Pivot]) ++ [Pivot] ++ qsort([X || X <- T, X >= Pivot]).


用List Comprehension实现Pythagorean Triplets:
pythag(N) ->
    [ {A,B,C} ||
        A <- lists:seq(1,N),
        B <- lists:seq(1,N),
        C <- lists:seq(1,N),
        A+B+C =< N,
        A*A+B*B =:= C*C
    ].


算数表达式
Op           Argument Type Priority
+X               Number       1
-X               Number       1
X*Y              Number       2
X/Y              Number       2
bnot X           Integer      2
X div Y          Integer      2
X rem Y          Integer      2
X band Y         Integer      2
X+Y              Number       3
X-Y              Number       3
X bor Y          Integer      3
X bxor Y         Integer      3
X bsl N          Integer      3
X bsr N          Integer      3

优先级为1的先执行,然后是2,and so on
可以用括号改变优先级,括号内的先执行
相同优先级的按从左到右执行

Guard是Erlang里的的一种表达式,关键字为when
max(X, Y) when X > Y -> X;
max(X, Y) -> Y.


Guard Sequence是一个或多个Guard,用“;”隔开
G1;G2;...;Gn中至少有一个Guard为true的话则这个Guard Sequence为true

Guard是一个或多个Guard表达式,用“,”隔开
GuardExpr1,GuardExpr2,...,GuardExprN中所有Guard表达式都为true时为true

合法的Guard表达式:
1,The atom true
2,Other constants(terms and bound variables),all evaluate to false
3,Calls to the guard predicates and to the BIFs
4,Term comparisons
5, Arithmetic expressions
6, Boolean expressions
7, Short-circuit boolean expressions

Guard predicates:
is_atom(X)
is_binary(X)
is_constant(X)
is_float(X)
is_function(X)
is_function(X, N)
is_integer(X)
is_list(X)
is_number(X)
is_pid(X)
is_port(X)
is_reference(X)
is_tuple(X)
is_record(X, Tag)
is_record(X, Tag, N)


Guard true用于在if表达式中catch all:
if
    Guard -> Expressions;
    Guard -> Expressions;
    ...
    true -> Expressions
end


Guard buit-in functions:
abs(X)
element(N, X)
float(X)
hd(X)
length(X)
node()
node(X)
round(X)
self()
size(X)
trunc(X)
tl(X)


Record用来给Tuple的元素起名字:
-record(todo, {status=reminder, who=joe,text}).

Record的filed可以有默认值
Record定义可以在Erlang源代码里或者放在外部.hrl文件里并被Erlang源代码所引入
我们可以在Eshell里使用rr()方法来读取Record定义:
1> rr("records.hrl").
[todo]

创建和修改Record:
2> X=#todo{}.
#todo{status = reminder, who = joe, text = undefined}
3> X1=#todo{status=urgent, text="Fix errata in book"}.
#todo{status = urgent, who = joe, text = "Fix errata in book"}
4> X2=X1#todo{status=done}.
#todo{status = done, who = joe, text = "Fix errata in book"}
5> #todo{who=W, text=Txt} = X2.
#todo{status = done, who = joe, text = "Fix errata in book"}
6> W.
joe
7> Txt.
"Fix errata in book"
8> X2#todo.text.
"Fix errata in book"


Record是Tuple的伪装:
1> X.
#todo{status = done, who = joe, text = "Fix errata in book"}
2> rf(todo).
ok
3> X.
{todo, done, joe, "Fix errata in book"}


case表达式:
case Expression of
    Pattern1 [when Guard1] -> Expr_seq1;
    Pattern2 [when Guard2] -> Expr_seq2;
    ...
end


if表达式:
if
    Guard1 ->
        Expr_seq1;
    Guard2 ->
        Expr_seq2;
    ...
end


将一个整数List按奇偶分成两个List:
odds_and_evens(L) ->
  odds_and_evens(L, [], []).

odds_and_evens([H|T], Odds, Evens) ->
  case (H rem 2) of
    1 -> odds_and_evens(T, [H|Odds], Evens);
    0 -> odds_and_evens(T, Odds, [H|Evens])
  end;
odds_and_evens([], Odds, Evens) ->
  {lists:reverse(Odds), lists:reverse(Evens)}.
分享到:
评论
2 楼 linbzh 2011-06-26  
请问scala在国内的使用情况怎么样?erlang和scala的性能比较又怎么样?
1 楼 yuyoo_zhao 2010-12-07  
这篇完全没有看懂,一开头就是雾水

相关推荐

    erlang programming

    3. **分布式系统**:“面对软件错误构建可靠的分布式系统.pdf”强调了Erlang在构建分布式系统时的优势。Erlang提供了一套完整的工具和库,如分布式节点、分布式进程、分布式数据库和分布式故障恢复机制,使得开发者...

    Programming Erlang.pdf

    本书《Programming Erlang》旨在帮助读者理解和掌握如何使用Erlang编程语言来构建并行世界中的软件。从目录可以看出,本书首先介绍了Erlang的基础概念和安装指南,随后逐步深入到更高级的主题和技术细节。通过这种...

    《Programming Erlang》

    《Programming Erlang》是Joseph Armstrong所著的一本详细介绍Erlang编程语言的书籍。这本书旨在帮助读者理解Erlang的设计哲学、语法特性以及如何利用它来构建高效、容错的并发系统。Erlang是一种静态类型、函数式...

    programming erlang src code

    3. 并发模型:Erlang的并发模型基于actor模型,每个进程都有自己的状态,并通过消息进行交互。这种模型有助于实现分布式和容错系统,因为进程之间的通信是异步的,不会因某个进程阻塞而影响整个系统。 4. 热代码...

    读书笔记:ErlangOTP设计原则中文文档.zip

    读书笔记:ErlangOTP设计原则中文文档

    erlang-23.2.1-1.el7.x86-64.rpm

    Erlang:RabbitMQ 是用 Erlang 编写的,因此需要 Erlang 运行时。确保安装了兼容的 Erlang 版本;Erlang:RabbitMQ 是用 Erlang 编写的,因此需要 Erlang 运行时。确保安装了兼容的 Erlang 版本;Erlang:RabbitMQ ...

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

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

    Erlang Programming 导读.pdf

    ### Erlang Programming 导读.pdf 知识点详解 #### 一、Erlang简介与特点 **Erlang**是一种通用的、并发性强的、容错性高的编程语言,适用于构建分布式系统的软件。它最初由爱立信公司开发,用于解决电信系统中的...

    Programming Erlang

    《Programming Erlang》是由Joe Armstrong编著的一本关于Erlang编程语言的经典著作。这本书深入浅出地介绍了Erlang的各个方面,旨在帮助读者理解和掌握这门强大的并发和分布式计算语言。 Erlang是一种静态类型、...

    Pragmatic.Programming.Erlang.2nd.Edition

    ### 关于《Pragmatic Programming Erlang 第二版》的核心知识点概述 #### 一、书籍基本信息及背景介绍 《Pragmatic Programming Erlang 第二版》由Erlang之父Joe Armstrong撰写,是一本深入浅出地介绍了Erlang语言...

    Programming Erlang second edition

    《Programming Erlang second edition》是Joe Armstrong的经典著作,它是Erlang编程语言领域的权威指南,该书第二版于2013年首次发行。书中不仅覆盖了Erlang的核心语言和框架基础知识,还包括了重要的社区项目,例如...

    Centos7安装RabbitMQ的文档和安装包(包含erlang安装包).rar

    3. **启动和管理RabbitMQ**: 安装完成后,启动RabbitMQ服务并设置它在系统启动时自动启动: ``` sudo systemctl start rabbitmq-server sudo systemctl enable rabbitmq-server ``` 4. **配置RabbitMQ**: ...

    Erlang安装包,版本:otp_win64_24.1.7.exe

    otp_win64_24.1.7.exe

    programming-erlang-software-for-a-concurrent-world

    Pragmatic Programmer,Pragmatic Programming,Pragmatic Bookshelf and the linking g device are trademarks of The Pragmatic Programmers,LLC. Every precaution was taken in the preparation of this book....

    《Erlang之父:为什么面向对象很糟糕》PDF

    《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF

    Programming Erlang 2nd.pdf

    Concurrency is natural in ...The model of programming that Erlang uses is very similar to how the world works. This makes programming easy. Many programmers have discovered this, as have many companies.

Global site tag (gtag.js) - Google Analytics