Erlang中atom数据类型能够做的唯一的运算就是比较;
在erlang中模块名和方法名都是原子;
Atom用来构造Tag-Message,Atom的比较时间是常量的,与Atom的长度无关;(如果拿binary做tag,比较时间是线性的);
Atom就是为比较而设计,除了比较运算不要把Atom用在别的运算中.
Erlang M-F-A方法调用可以做的非常灵活,我们在shell里面操练一下:
[1,2,3,4,5] 2> L=lists. lists 3> S=seq. seq 4> L:S(1,5). [1,2,3,4,5] 5> L:seq(1,5). [1,2,3,4,5] 6> L2=list_to_atom("list" ++"s"). lists 7> L2:seq(1,5). [1,2,3,4,5] 8> apply(list_to_atom("li"++"sts"),seq,[1,5]). [1,2,3,4,5]
Erlang的atom不参与垃圾回收机制 ,一旦创建就不会被移除掉;一旦超出atom的数量限制(默认是1048576) ,VM就会终止掉.对于一个会持续运行很久的系统,把任意字符串转成atom是很危险的,内存会慢慢被吃光.如果使用的原子是在预期范围内的,比如协议模块的名称,那么可以使用list_to_existing_atom来进行防范,这个方法所产出的atom必须是之前已经创建过的。
我们可以使用
string:tokens(binary_to_list(erlang:system_info(info)),"\n")在shell中看一下atom的使用情况,输出的片段中恰好包含了原子内存使用的情况,当前数量和数量限制。
但是在shell中输入上面的命令,结果因为太长而出现省略
[...]|...],这
是在调用os:getenv()的时候遇到的这个问题。可以
使用
shell中的rp方法
格式化输出结果,显示全部内容。
下面了解下Erlang的所有shell命令:
** shell internal commands ** b() -- display all variable bindings e(N) -- repeat the expression in query <N> f() -- forget all variable bindings f(X) -- forget the binding of variable X h() -- history history(N) -- set how many previous commands to keep results(N) -- set how many previous command results to keep catch_exception(B) -- how exceptions are handled v(N) -- use the value of query <N> rd(R,D) -- define a record rf() -- remove all record information rf(R) -- remove record information about R rl() -- display all record information rl(R) -- display record information about R rp(Term) -- display Term using the shell's record information rr(File) -- read record information from File (wildcards allowed) rr(F,R) -- read selected record information from file(s) rr(F,R,O) -- read selected record information with options ** commands in module c ** bt(Pid) -- stack backtrace for a process c(File) -- compile and load code in <File> cd(Dir) -- change working directory flush() -- flush any messages sent to the shell help() -- help info i() -- information about the system ni() -- information about the networked system i(X,Y,Z) -- information about pid <X,Y,Z> l(Module) -- load or reload module lc([File]) -- compile a list of Erlang modules ls() -- list files in the current directory ls(Dir) -- list files in directory <Dir> m() -- which modules are loaded m(Mod) -- information about module <Mod> memory() -- memory allocation information memory(T) -- memory allocation information of type <T> nc(File) -- compile and load code in <File> on all nodes nl(Module) -- load module on all nodes pid(X,Y,Z) -- convert X,Y,Z to a Pid pwd() -- print working directory q() -- quit - shorthand for init:stop() regs() -- information about registered processes nregs() -- information about all registered processes xm(M) -- cross reference check a module y(File) -- generate a Yecc parser ** commands in module i (interpreter interface) ** ih() -- print help for the i module true
这些方法的内部实现为:
bt(Pid) -> c:bt(Pid). c(File) -> c:c(File). c(File, Opt) -> c:c(File, Opt). cd(D) -> c:cd(D). erlangrc(X) -> c:erlangrc(X). flush() -> c:flush(). i() -> c:i(). i(X,Y,Z) -> c:i(X,Y,Z). l(Mod) -> c:l(Mod). lc(X) -> c:lc(X). ls() -> c:ls(). ls(S) -> c:ls(S). m() -> c:m(). m(Mod) -> c:m(Mod). memory() -> c:memory(). memory(Type) -> c:memory(Type). nc(X) -> c:nc(X). ni() -> c:ni(). nl(Mod) -> c:nl(Mod). nregs() -> c:nregs(). pid(X,Y,Z) -> c:pid(X,Y,Z). pwd() -> c:pwd(). q() -> c:q(). regs() -> c:regs(). xm(Mod) -> c:xm(Mod). y(File) -> c:y(File). y(File, Opts) -> c:y(File, Opts).