Erlang的atom


Erlang中atom数据类型能够做的唯一的运算就是比较;
在erlang中模块名和方法名都是原子;
Atom用来构造Tag-Message,Atom的比较时间是常量的,与Atom的长度无关;(如果拿binary做tag,比较时间是线性的);
Atom就是为比较而设计,除了比较运算不要把Atom用在别的运算中. 
Erlang M-F-A方法调用可以做的非常灵活,我们在shell里面操练一下:
1 > lists: seq( 1 , 5 ).
[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命令
1 > help().
** 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

这些方法的内部实现为:
bi(I) -> c: bi(I).
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).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值