Programming Erlang读书笔记3: Sequential Programming

news/2024/5/18 23:43:41 标签: Erlang, 读书, Apple, C, C++
module是Erlang代码的基本单元,我们写的所有function都存储在module里面,module存储在.erl文件里面
module编译成.beam文件后方可运行

Erlang_HOME建立一个名为.erlang的文件:
[code]
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())]).
[/code]
这样启动Erlang自带的Windows程序时会自动切换到work目录

funs是匿名方法:
[code]
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.
[/code]

返回funs的方法和可以接受funs作为参数的方法被称为higher-order方法
接受funs作为参数的方法:
[code]
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]
[/code]
返回funs的方法:
[code]
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]
[/code]

Erlang没有for循环,但我们可以自己定义一个:
[code]
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]
[/code]

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

使用List Comprehension([F(X) || X <- L])来简化编程和增加可读性:
[code]
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]
[/code]

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

用List Comprehension实现Pythagorean Triplets:
[code]
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
].
[/code]

算数表达式
[code]
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
[/code]
优先级为1的先执行,然后是2,and so on
可以用括号改变优先级,括号内的先执行
相同优先级的按从左到右执行

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

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:
[code]
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)
[/code]

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

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

Record用来给Tuple的元素起名字:
[code]
-record(todo, {status=reminder, who=joe,text}).
[/code]
Record的filed可以有默认值
Record定义可以在Erlang源代码里或者放在外部.hrl文件里并被Erlang源代码所引入
我们可以在Eshell里使用rr()方法来读取Record定义:
[code]
1> rr("records.hrl").
[todo]
[/code]
创建和修改Record:
[code]
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"
[/code]

Record是Tuple的伪装:
[code]
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"}
[/code]

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

if表达式:
[code]
if
Guard1 ->
Expr_seq1;
Guard2 ->
Expr_seq2;
...
end
[/code]

将一个整数List按奇偶分成两个List:
[code]
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)}.
[/code]

http://www.niftyadmin.cn/n/727669.html

相关文章

java火柴游戏_【求助】java小游戏【拿火柴】游戏的问题,谢谢了!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼}});userBtn.setBounds(400, 40, 90, 20);mainPanel.add(userBtn);//用户按钮添加到主面板上 userNum new JComboBox();//定义一个下拉列表框for (int i 0; i < MAX_TAKE; i)//定义一个拿最大的循环{userNum.addItem(i 1);//…

成功者的这十个心态,值得我们学习

提及成功&#xff0c;很多人都从不同的角度来诠释。为什么有的人会成功&#xff0c;你知道成功者有哪些行为值得我们学习吗&#xff1f; 1、有目标 目标大&#xff0c;问题就小&#xff1b;目标小&#xff0c;问题就大&#xff1b;&#xff01;一个人有目标就睡不着&#xff0c…

程序自保存任意类型资源文件

////TITLE:// 程序自保存任意类型资源文件//AUTHOR:// norains//DATE:// Monday 08-December-2008//Environment:// WINCE 5.0 ARM4VI BSP// 首先说一下&#xff0c;这标题听起来自己都觉得拗口&#xff0c;但限于本人文采所限&#xff0c;实在想不出更好的篇目…

Programming Erlang读书笔记4: Exceptions

语法: [code] try FuncOrExpressionSequence ofPattern1 [when Guard1] -> Expressions1;Pattern2 [when Guard2] -> Expressions2;... catchExceptionType: ExPattern1 [when ExGuard1] -> ExExpressions1;ExceptionType: ExPattern2 [when ExGuard2] -> ExExpres…

JAVA完美字符串尽可能长_阿里巴巴高级Java面试题 续2

八、深入理解java异常处理机制引子try…catch…finally恐怕是大家再熟悉不过的语句了&#xff0c;public class TestException {public TestException() {}boolean testEx() throws Exception {boolean ret true;try {ret testEx1();} catch (Exception e) {System.out.print…

面向接口编程详解

作者&#xff1a;T2噬菌体 来自&#xff1a;http://www.cnblogs.com/leoo2sk/archive/2008/04/10/1146447.html 面向接口编程详解&#xff08;一&#xff09;——思想基础 我想&#xff0c;对于各位使用面向对象编程语言的程序员来说&#xff0c;“接口”这个名词一定不陌生&a…

如何才能成为一个合格的项目负责人?

初为一个项目负责人&#xff0c;我们一定要对自己的项目有一个详细的了解和认识&#xff0c;首先&#xff0c;应该对自己的项目团队做一个定位。 要对自己的团队的成员有一个清晰的认识和了解&#xff1a;每个人的性格、特长、兴趣爱好、特点等都要深入了解&#xff0c;每每提起…

Rails宝典八十七式: 生成RSS feeds

看看Rails2.0生成RSS feeds有多简单: routes.rb: [code] map.resources :articles [/code]app/controllers/articles_controller.rb: [code] def indexarticles Article.find(:all) end [/code]app/views/index.html.erb: [code] <% link_to "RSS Feed", formatt…