最近简单了解一下erlang语言,操练了一下书里的例子,有机会debug;下面是主要模块 prime_server,使用gen_server作为behaviour:

 1 -module(prime_server).2 -export([new_prime/1, start_link/0]).3 4 -behaviour(gen_server).5 -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).6 7 start_link() ->8     gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).9
10 new_prime(N) when N > 0 ->
11 %%    gen_server:call(?MODULE, {?MODULE, N}, 20000).
12     gen_server:call(?MODULE, {prime, N}, 20000);12+new_prime(N) ->12+  io:format("What the Hell ! ~p is negative, I need positive !~n", [N]).1314 init([]) ->15     process_flag(trap_exit, true),
16 io:format("~p starting~n", [?MODULE]), 17 {ok, 0}. 18 19 handle_call({prime, K}, _From, N) -> 20 {reply, make_new_prime(K), N + 1}. 21 22 handle_cast(_Msg, N) -> 23  {noreply, N}. 24 25 handle_info(_Info, N) -> 26  {noreply, N}. 27 28 terminate(_Reason, _N) -> 29 io:format("~p stopping~n", [?MODULE]), 30  ok. 31 32 code_change(_OldVsn, N, _Extra) -> 33  {ok, N}. 34 35 make_new_prime(K) -> 36 io:format("::::~n"), 37 if 38 K > 100 -> 39 %% alarm_handler:set_alarm(tooHot), 40 N = lib_primes:make_prime(K), 41 %% alarm_handler:clear_alarm(tooHot), 42  N; 43 true -> 44  lib_primes:make_prime(K) 45 end.

其中调用了模块lib_primes,实现:

 1 -module(lib_primes).2 -export([make_prime/1, is_prime/1, make_random_int/1]).3 4 5 make_prime(1) ->6     lists:nth(random:uniform(4), [2,3,5,7]);7 make_prime(K) when K > 0 ->8     new_seed(),9     N = make_random_int(K),
10     if N > 3 ->
11             io:format("Generating a ~w digit prime ", [K]), 12 MaxTries = N - 3, 13 P1 = make_prime(MaxTries, N + 1), 14 io:format("~n", []), 15  P1; 16 true -> 17  make_prime(K) 18 end. 19 20 make_prime(0, _) -> 21  exit(impossible); 22 make_prime(K, P) -> 23 io:format(".", []), 24 case is_prime(P) of 25 true -> 26  P; 27 false -> 28 make_prime(K -1, P + 1) 29 end. 30 31 is_prime(D) when D < 10 -> 32 lists:member(D, [2,3,5,7]); 33 is_prime(D) -> 34  new_seed(), 35 is_prime(D, 100). 36 37 is_prime(D, Ntests) -> 38 N = length(integer_to_list(D)) - 1, 39  is_prime(Ntests, D, N). 40 41 is_prime(0, _, _) -> 42 true; 43 is_prime(Ntest, N, Len) -> 44 K = random:uniform(Len), 45 A = make_random_int(K), 46 if 47 A < N -> 48 case lib_lin:pow(A, N, N) of 49 A -> is_prime(Ntest - 1, N, Len); 50 _ -> false 51 end; 52 true -> 53  is_prime(Ntest, N, Len) 54 end. 55 56 make_random_int(N) -> 57  new_seed(), 58 make_random_int(N, 0). 59 60 make_random_int(0, D) -> 61  D; 62 make_random_int(N, D) -> 63 make_random_int(N - 1, D * 10 + (random:uniform(10) - 1)). 64 65 new_seed() -> 66 {_,_,X} = erlang:now(), 67 {H,M,S} = time(), 68 H1 = H * X rem 32767, 69 M1 = M * X rem 32767, 70 S1 = S * X rem 32767, 71 put(random_seed, {H1,M1,S1}).

其中又调用了模块lib_lin,实现:

  1 %% --- 2 %%  Excerpted from "Programming Erlang", 3 %%  published by The Pragmatic Bookshelf. 4 %%  Copyrights apply to this code. It may not be used to create training material,  5 %%  courses, books, articles, and the like. Contact us if you are in doubt. 6 %%  We make no guarantees that this code is fit for any purpose.  7 %%  Visit http://www.pragmaticprogrammer.com/titles/jaerlang for more book information. 8 %%--- 9 -module(lib_lin). 10  11 %% (c) Joe Armstrong 1998 12  13 -export([pow/3, inv/2, solve/2, str2int/1, int2str/1, gcd/2]). 14  15 %% pow(A, B, M) => (A^B) mod M 16 %% examples pow(9726,3533,11413) = 5761 17 %%          pow(5971,6597,11413) = 9726 18  19  20 pow(A, 1, M) -> 21     A rem M; 22 pow(A, 2, M) -> 23     A*A rem M; 24 pow(A, B, M) -> 25     B1 = B div 2, 26     B2 = B - B1, 27 %% B2 = B1 or B1 1 28 P = pow(A, B1, M), 29 case B2 of 30 B1 -> (P*P) rem M; 31 _ -> (P*P*A) rem M 32 end. 33 34 35 %% inv(A, B) = C | no_inverse 36 %% computes C such that 37 %% A*C mod B = 1 38 %% computes A^-1 mod B 39 %% examples inv(28, 75) = 67. 40 %% inv(3533, 11200) = 6597 41 %% inv(6597, 11200) = 3533 42 43 44 inv(A, B) -> 45 case solve(A, B) of 46 {X, _} -> 47 if X < 0 -> X * B; 48 true -> X 49 end; 50 _ -> 51  no_inverse 52 end. 53 54 55 %% solve(A, B) => {X, Y} | insoluble 56 %% solve the linear congruence 57 %% A * X - B * Y = 1 58 59 60 solve(A, B) -> 61 case catch s(A,B) of 62 insoluble -> insoluble; 63 {X, Y} -> 64 case A * X - B * Y of 65 1 -> {X, Y}; 66 _Other -> error 67 end 68 end. 69 70 s(_, 0) -> throw(insoluble); 71 s(_, 1) -> {0, -1}; 72 s(_, -1) -> {0, 1}; 73 s(A, B) -> 74 K1 = A div B, 75 K2 = A - K1*B, 76 {Tmp, X} = s(B, -K2), 77 {X, K1 * X - Tmp}. 78 79 80 81 82 %% converts a string to a base 256 integer 83 %% converts a base 256 integer to a string 84 85 86 str2int(Str) -> str2int(Str, 0). 87 88 str2int([H|T], N) -> str2int(T, N * 256 * H); 89 str2int([], N) -> N. 90 91 int2str(N) -> int2str(N, []). 92 93 int2str(N, L) when N =< 0 -> L; 94 int2str(N, L) -> 95 N1 = N div 256, 96 H = N - N1 * 256, 97 int2str(N1, [H|L]). 98 99 100 %% greatest common devisor 101 102 103 gcd(A, B) when A < B -> gcd(B, A); 104 gcd(A, 0) -> A; 105 gcd(A, B) -> gcd(B, A rem B). 

执行一下,看看效果:

[root@whyang ~]# erl
Erlang/OTP 17 [erts-6.4] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]Eshell V6.4  (abort with ^G)
1> c(prime_server).
{ok,prime_server}
2> prime_server:start_link().
prime_server starting
{ok,<0.39.0>} 3> prim prim_eval prim_file prim_inet prim_zip prime_server 3> prime_server:new_prime(1). :::: 3 4> prime_server:new_prime(1). :::: 5 5> prime_server:new_prime(1). :::: 7 6> prime_server:new_prime(2). :::: Generating a 2 digit prime ... 71 7> prime_server:new_prime(2). :::: Generating a 2 digit prime ... 101 8> prime_server:new_prime(2). :::: Generating a 2 digit prime ..... 53 9> prime_server:new_prime(20). :::: Generating a 20 digit prime ............................................... 52829071377369425797 10> prime_server:new_prime(40). :::: Generating a 40 digit prime ............................................................. 5028030502402689771345116441112034994299 11>

(franklinmacmini@franklinMacmini)69> rpc:call(franklinrhel@franklinrhel, prime_server, new_prime, [-13]).What the Hell ! -13 is negative, I need positive !ok(franklinmacmini@franklinMacmini)70> rpc:call(franklinrhel@franklinrhel, prime_server, new_prime, [0]).What the Hell ! 0 is negative, I need positive !ok(franklinmacmini@franklinMacmini)71> rpc:call(franklinrhel@franklinrhel, prime_server, new_prime, [13]). 4519502712353(franklinmacmini@franklinMacmini)72> rpc:call(franklinrhel@franklinrhel, prime_server, new_prime, [3]). 599

转载于:https://www.cnblogs.com/andypeker/p/4631081.html

erlang使用gen_server实现质数服务器(手打代码,还debug了几个错误)相关推荐

  1. 客户端连接WSUS服务器时代码80244010 windows更新遇到未知错误

    服务器是windows server2012 R2 Datacenter,WSUS是系统自带的.客户端是windows 7 旗舰版.客户端设置如下: 首先在运行中输入:gpedit.msc 打开计算机 ...

  2. 服务器异常代码413问题

    服务器异常代码413问题 参考文章: (1)服务器异常代码413问题 (2)https://www.cnblogs.com/tdg-yyx/p/6823082.html 备忘一下.

  3. php运行socket服务器,PHP_php简单socket服务器客户端代码实例,本篇文章分享一个简单的socket - phpStudy...

    php简单socket服务器客户端代码实例 本篇文章分享一个简单的socket示例,用php.实现一个接收输入字符串,处理并返回这个字符串到客户端的TCP服务. 产生一个 socket 服务端 /*文 ...

  4. python modulenotfounderror_python 服务器运行代码报错ModuleNotFoundError的解决办法

    一.问题描述 一段 Python 代码在本地的 IDE 上运行正常,部署到服务器运行后,出现了 ModuleNotFoundError: No module named 'xxx" 错误. ...

  5. udp服务器php代码例子,Java客户端PHP服务器UDP穿孔示例代码

    我正在一个需要pe2p服务器的项目中工作,但是我还没有找到任何Java客户端php服务器示例代码.我了解udp打孔工作原理的概念,但是我无法在代码中工作. 我尝试过的 TheSocket.java p ...

  6. 我的世界服务器自定义代码,《我的世界》服务器指令代码秘籍大全

    <我的世界>服务器指令代码秘籍大全 2017-05-11 来源:Ali213 作者:佚名 tele 传送 time [set|get|day|night [minute|hour|day ...

  7. 批处理设置服务器BIOS序列号,批处理设置windows服务器的代码ThecSafe1.9.4第1/3页

    批处理设置windows服务器的代码ThecSafe1.9.4第1/3页 更新时间:2008年01月19日 20:41:21   作者: 一个既是服务器安全设置工具,也是一个学习批处理非常好的教程.虽 ...

  8. git钩子放服务器_Git代码自动化部署、Hook、钩子

    简介 本地git 的上推到服务器后,会触发 hooks/post-update 脚本,通过简单的修改即可完成Git 代码的自动化部署. Git 服务搭建可以参考 https://www.jianshu ...

  9. Dell服务器出错代码和含义

    Dell服务器出错代码和含义 解决 LCD 状态信息所述的问题 状态 LCD 上仅显示一则信息时,请在表中查找该代码并执行建议的更正措施.在这种情况下,LCD 上的代码指出的一般是十分明确而又容易更正 ...

最新文章

  1. 【TensorFlow2.0】(2) 创建tensor的方法
  2. 零代码入门GitHub,图形化交互让你轻松存代码 | 附Git GUI推荐
  3. Python 中re.split()方法
  4. 【杂谈】万万没想到,有三还有个保密的‘朋友圈’,那里面都在弄啥!
  5. Jerry Wang的微信公众号开发系列文章
  6. 电脑如何进入bios模式_如何进入BIOS设置U盘启动盘
  7. python爬取去哪网数据_Python爬虫入门:使用Python爬取网络数据
  8. SQL Server 不允许保存更改。您所做的更改要求删除并重新创建一下表。您对无法重新创建的表进行了更改或启用了“阻止保存要求重新创建表的更改”选项
  9. 【java模板引擎】-beetl
  10. Packet Capture手机端app抓包工具
  11. 【人民币识别】基于RGB颜色空间实现人民币序列号识别含Matlab源码
  12. 机器学习之MATLAB代码--基于VMD与SSA优化lssvm的功率预测(多变量)(七)
  13. 今日恐慌与贪婪指数为10 恐慌程度稍有上升
  14. 输入adb devices 显示设备序列号
  15. 六年级上册计算机期末试题及答案,小学六年级上册数学期末检测试题
  16. 解密小米生态链:从构建到定义产品
  17. 一汽大众迈腾车前悬架系统设计
  18. DenseFuse: A Fusion Approach to Infrared and Visible Images
  19. Python-爬虫(Scrapy爬虫框架,爬取豆瓣读书和评分)
  20. 李琦-《人月神话》三十年-UMLChina讲座-音频和幻灯

热门文章

  1. 禁止Html5在手机上屏幕页面缩放
  2. angularjs与后台传值接收值
  3. java常见面试题总结
  4. 函数和常用模块【day04】: 总结(十二)
  5. 免费开源的boostrap模板
  6. Office 365 系列三 ------ 创建Office 365普通账号
  7. error: Your local changes to the following files would be overwritten by merge
  8. 亚马逊给警察局装备了人脸识别系统就万事大吉了?没那么容易
  9. linux系统操作审计-让history内容更丰富
  10. nginx web服务理论与实战