如何知道原子或字符串是否是有效的标识符

时间:2016-12-10 04:23:53

标签: erlang elixir

是否有类似Python的str.isidentifier

>>> "foo".isidentifier()
True
>>> "42".isidentifier()
False

2 个答案:

答案 0 :(得分:4)

在Erlang中,原子用于表示常量值。

Erlang/OTP 18 [erts-7.0] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V7.0  (abort with ^G)
1> is_atom(sunday).
true
2> is_atom('sunday').
true
3> is_atom("sunday").
false
4> 

而且,erlang中没有string类型。 string只是一个整数列表。

8> B = [115,117,110,100,97,121].
"sunday"
9> is_list(B).
true
10> 

答案 1 :(得分:4)

任何atom都是有效的"标识符",因为它可以是Erlang和Elixir中函数的名称。但是,由于某些原子需要引用,您可能需要一些技巧来实际定义这样的函数。

在Erlang中,引用the reference manual

  

如果原子不是以小写字母开头,或者包含除字母数字字符,下划线(_)或@之外的其他字符,则用单引号(')括起来。

我找不到Elixir的类似描述,但我认为它类似。

This blog post解决了如何创建此类函数的问题。简而言之,在Erlang中,您只需将函数名称放在单引号中,然后就完成了:

-module(fortytwo).

-export(['42'/1]).

'42'(X) ->
    {ok, X}.

可以从shell中调用此函数:

> fortytwo:'42'(a).
{ok,a}

在Elixir中,您需要使用unquote宏来定义函数:

defmodule Fortytwo do
  def unquote(:"42")(x) do
    {:ok, x}
  end
end

并且无法在正常函数调用中引用函数名称,因此您需要使用apply

> apply(Fortytwo, :"42", [:a])
{:ok, :a}