erlang - 将一个数字作为Name参数传递给register / 2

时间:2014-07-01 11:23:25

标签: erlang

当使用register / 2时,当我尝试传递一个数字作为进程名称参数时,出现错误。在这里,我尝试将shell进程命名为“1”,并收到以下错误:

43> register(1,self()).
** exception error: bad argument
     in function  register/2
        called as register(1,<0.93.0>)

对比这个命名shell'shelly':

44> register(shelly,self()).
true

文档说寄存器中的Name参数(Name,PID)必须是一个原子。我认为数字1确实是一个原子。

我的问题是:如何成功传递一个数字到寄存器/ 2,例如,传递绑定变量P = 1成功?

2 个答案:

答案 0 :(得分:4)

原子是一个符号,与整数无关。没有从整数到原子的直接转换,但您可以使用中间列表:

1> Int_to_atom = fun(X) -> list_to_atom(integer_to_list(X)) end.
#Fun<erl_eval.6.106461118>
2> Int_to_atom(2).                                              
'2'
3> P = 1.
1
4> Int_to_atom(P).
'1'
5>

答案 1 :(得分:2)

来自Erlang documentation on datatypes

  

原子是文字,是名称的常量。原子应该被封闭   如果它不以小写字母开头,则用单引号(')表示   如果它包含除字母数字字符以外的其他字符,   下划线(_)或@。

你可以做到

register('1',self()).

(注意单引号,使其成为原子而不是数字。你可以通过尝试看到它不是数字而是原子

'1' + 1

当你期望它们可以互换时,你可能会想到“ term ”。 Erlang 术语是一个单一的数据。作为术语的一些例子:

  • 一个原子
  • 一个数字
  • 一个元组(本身包含更多术语)
  • 一个列表(本身包含更多术语)
  • 二进制文件
  • 一个功能