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

Erlang顺序编程(一)

阅读更多
模块(module):
module是erlang中代码的基本单元,所有函数都位于模块之中,模块文件一般存放在.erl文件中。
要运行一个模块,首先要先编译它,编译成功之后会生成一个.beam的文件。
模块名与文件名一致
-module(test2).
-export([area/1]).
area({rectangle,Width,Ht}) ->
	Width*Ht;
area({circle,R}) ->
	3.14*R*R.

调用:
c(test2). //编译文件
test2:area({circle,5}). //调用test2模块的area函数。


查看自己当前的工作区间:pwd().

Erlang中三种标点符号:逗号,句号,分号。
逗号:用来分隔函数的调用,数据构造器,以及模式中的参数。
句号:用来分隔一条完整的函数或表达式。
分号:用来分隔子句。

函数的目就是拥有的参数数量,在erlang中同一模块的两个函数,名字相同,目不同,他们是不同的两个函数。

fun:匿名函数。
Z=fun(X) -> 2*X end.

调用
Z(2).


fun可以拥有任意数量的参数。
hypot = fun(X,Y) -> math:sqrt(X*X+Y*Y) end.

调用
Hypot(3,4).


fun可以有若干不同的子句。
Temp = fun({c,C}) -> {f,32+C*9/5};
	  ({f,F}) -> {c,(F-32)*9/5}
       end.

调用
Temp(c,100).


fun可以作为函数的参数使用。
lists:map(F,L):这个函数将fun F应用到列表L的每一个元素上,返回一个新的列表。
Double = fun(X) -> X*2 end.
L=[1,2,3,4].
lists:map(Double,L).
//[2,4,6,8]

lists:filter(F,L):返回一个新列表,新列表由列表L中每一个能满足F(E)为true的元素组成。
P=fun(X) -> (X rem 2)=:=0 end.
lists:filter(P,L).
//[2,4]

=:=是一个恒等测试符号。

fun可以作为函数的返回值。
Fruit=[apple,pear,orange].
MakeTest=fun(L)->(fun(X)->lists:member(X,L) end) end.
IsFruit = MakeTest(Fruit).
IsFruit(pear).
//true

lists:member(X,L):判断X是不是列表L的元素,如果是返回true,否则false.

erlang中没有for循环。
-module(for).
-export([for/3]).
for(Max,Max,F) ->
	[F(Max)];
for(I,Max,F) ->
	[F(I)|for(I+1,Max,F)].


列表解析:列表解析是一种无需使用fun,map,filter来创建列表的表达式。
例如:我们想让列表里面的每个元素加倍。以前的做法是
Lists:map(fun(X) -> 2*X end,L).

列表解析的做法:
[2*X||X<-L].


[F(X)|X<-L]代表“由F(X)组成的列表,其中X是取值于列表L”。

列表解析的常见形式:
[X||Qua1,Qua2,….]
X可以是任意表达式。每个限定词(Qua)可以是一个生成器或者是一个构造器。生成器通常形式:Pattern<-ListExpr。

排序算法:
-module(sort).
-export([sort/1]).
sort([P|T]) ->
    sort([X||X<-T,X<P])
    ++ [P] ++
    sort([X||X<-T,X>=P]);
sort([]) ->[].

++是一个中缀添加操作符。

比格拉斯三元组:
-module(pythag).
-export([pythag/1]).
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
    ].

lists:seq(1,N):返回一个由1-N的整数列表。

guard:一种用于强化模式匹配功能的结构。
例子:比较两个数的最大值。
max(X,Y) when X>Y ->X;
max(X,Y) ->Y.

在函数定义的头部使用guard,必须以when开头,也可以在任意表达式的地方使用guard,当guard用于表达式的时候,它被要求值为一个原子true或false。
guard序列可以是单个guard,也可以是一系列用分号分开的guard,在guard集合G1;G2;G3…;Gn中,只要任何一个guard为true,整个guard序列就为true。
guard也可以是一系列的用逗号分开的guard集合,guard集合G1,G2,G3…,Gn中,只有所有guard都为true时,整个guard序列才为true。
guard谓词:
is_atom(x):x是原子。
is_binary(X):X是二进制数据。
is_constant(X):X是常数。
is_float(X):X是浮点数。
is_function(X):X是函数。
is_function(X,N):X是有N个参数的函数。
is_integer(X):X是整数。
is_list(X):X是列表。
is_number(X):X是整数或者浮点数。
is_pid(X):X是进程标识符。
is_port(X):X是端口。
is_reference(X):X是引用。
is_tuple(X):X是元祖。
is_record(X,Tag,N):X是标记为Tag大小的N的记录。
is_record(X,Tag):X是标记为Tag大小的记录。

断言BIF(内置函数):
abs(X):X的绝对值。
element(N,X):元祖X的第N个元素。
float(X):将数字X转换为浮点数。
hd(X):列表X的头部。
length(X):列表X的长度。
node():当前节点。
node(X):创建X节点,X可以是进程标识符,引用或者端口。
round(X):对数字X进行四舍五入。
self():当前进程的进程标识符。
size(X):X的大小,X为元祖或者二进制数据。
trunk(X):将数字X转换为整数(截取)。
tl(X):列表X的尾部。

记录(record):记录提供了一种方法把一个名称与元祖中的一个元素对应起来。
定义语法:
-record(Name,{key1=Default1,key2=Default2,…}).

Name是记录的名字,key1,key2等是记录中的字段名,这些名字都必须是原子,记录中的每个字段都可以有默认值。如果在创建的时候,没有为某个特定字段指定值,那么就会使用默认值。
-record(todo,{status=reminder,who=come,text}).

一旦定义了记录,就能创建记录的实例。
X=#todo{}.
X1=#todo{status=aaa,who=come,text=aaa}.
X2=X1#todo{status=bbb}.

记录只是元祖的伪装,记录就是元祖。
rf(todo):告诉shell释放掉todo这个记录的定义。






分享到:
评论

相关推荐

    Erlang编程规则——中文翻译版本

    Erlang是一种高级编程语言,专为构建并发、分布式、容错的系统设计。Erlang语言的编程规则和约定对于保证代码的可读性、可维护性、性能和稳定性至关重要。本文将对Erlang编程规则的中文翻译版本中的部分内容进行详细...

    Erlang编程指南

    Erlang是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种可以应对大规模并发活动的编程语言和...顺序执行的Erlang是一个及早求值, 单次赋值和动态类型的函数式编程语言。

    erlang中文基础教程

    "Erlang中文基础教程" Erlang 编程语言是一种功能强大且灵活的编程语言,它提供了...Erlang 编程语言是一种功能强大且灵活的编程语言,提供了一个交互式的 shell 环境,支持顺序编程、模块和函数、编译和运行等特点。

    ErlangOTP并发编程实战(高清PDF版)

    书是讲述下一代编程语言Erlang 的权威著作,主要涵盖顺序型编程、异常处理、编译和运行代码、并发编程、并发编程中的错误处理、分布式编程、多核编程等内容。本书将帮助读者在消息传递的基础上构建分布式的并发系统...

    Erlang(32,64)安装程序

    Erlang(['ə:læŋ])是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种可以应对大规模并发活动...顺序执行的Erlang是一个及早求值, 单次赋值和动态类型的函数式编程语言

    Concurrent Programming in ERLANG (P1-90)

    以上详细阐述了Erlang中并发编程的相关知识点,从基础的顺序编程到复杂的并发和分布式编程,涵盖了Erlang语言的核心特性。这些知识点不仅有助于初学者快速入门,也为高级用户提供了深入理解和应用Erlang的强大工具。

    Erlang中文手册.pdf

    #### 1.2 顺序编程 - **1.2.1 Erlang Shell**:Erlang提供了一个交互式的命令行解释器,称为Erlang Shell,允许用户直接输入代码并立即看到结果。可以通过在命令行输入`erl`来启动。Shell支持与外部程序通信,但...

    erlang 24.0 龙芯 loongarch64 预编译版本

    Erlang是一种强大的并发编程语言,特别适合于构建高可用性、分布式系统,尤其是在电信、银行和互联网领域广泛应用。在给定的标题“erlang 24.0 龙芯 loongarch64 预编译版本”中,我们可以看到这个软件包是为龙芯...

    erlang 聊天室源码

    Erlang是一种面向并发的、函数式编程语言,特别适合构建高可用性和容错性的分布式系统,如聊天室。在本项目中,我们看到"erlang 聊天室源码"是一个初学者级别的实践项目,开发者花费了两周时间完成,并且在设计上受...

    Concurrent Programming in ERLANG

    - Erlang支持传统的顺序编程方式,但其真正的强项在于并行性和分布性。 - 通过学习顺序编程的基础,读者可以更好地理解Erlang如何处理数据流和控制结构。 **1.2 数据类型** - Erlang中有多种基本数据类型,如整数、...

    Erlang/OTP语言包

    ​ RabbitMQ是使用Erlang语言编写的,所以需要先配置Erlang. Erlang在1991年由爱立信公司向用户推出了第一个版本,经过不断的改进完善和发展,在1996年爱立信又为所有的...顺序执行的Erlang是一个及早求值,单次赋值

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

    Erlang是一种面向并发的、函数式编程语言,特别适合于构建高可用性和容错性的分布式系统。在Erlang中,"应用"(application)是组织代码的基本单元,它包含了模块、配置文件以及启动和停止应用程序的逻辑。在这个...

    RabbitMQ+erlang.zip

    而Erlang则是一种专门设计用于构建分布式、容错性、高并发系统的编程语言,因其在实时系统和并发处理方面的强大能力,成为RabbitMQ的基础。 **Erlang语言简介** Erlang由Ericsson公司开发,最初是为了电信系统设计...

    Erlang 百万级用户排行榜桶排序

    本案例聚焦于使用Erlang编程语言实现百万级用户的排行榜桶排序方法。Erlang以其并发处理和分布式计算能力而闻名,非常适合处理大数据场景。 桶排序(Bucket Sort)是一种非比较型整数排序算法,它的基本思想是将待...

    Erlang中文手册

    #### 1.2 顺序编程 - **Erlang Shell**: - **定义**: Erlang Shell 是一个交互式的命令行环境,允许用户输入Erlang代码并立即执行。 - **启动方式**: 在大多数操作系统上,可以通过命令行输入 `erl` 来启动Erlang...

    erlang入门手册

    Erlang入门手册深入浅出地介绍了Erlang语言的基本概念,包括顺序编程、并行编程、健壮性以及OTP设计原则。它为初学者提供了一个坚实的基础,帮助他们理解Erlang的核心特性,并开始构建并发和容错的应用程序。文档...

    编写分布式的Erlang程序:陷阱和对策

    Erlang作为一种专为构建高度并发、容错性强的分布式系统的编程语言,其特性非常适合处理复杂多变的网络环境。然而,即便是这样一种设计完善的语言,在实际应用中也会遇到挑战。 #### 分布式陷阱 在深入分析之前,...

    Erlang list用法

    Erlang是一种并发、分布式、面向进程的编程语言,广泛用于构建高可用性和容错性的系统。在Erlang中,列表是一种基本的数据结构,提供了丰富的操作函数。以下是对标题和描述中提到的Erlang列表函数的详细解释: 1. `...

Global site tag (gtag.js) - Google Analytics