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

Erlang 如何知道原子或字符串是否为有效标识符,erlang,elixir,Erlang,Elixir,是否有类似Python的str.isidentifier: >“foo”.isidentifier() 真的 >>>“42”。isidentifier() 假的 在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&g

是否有类似Python的
str.isidentifier

>“foo”.isidentifier()
真的
>>>“42”。isidentifier()
假的

在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
类型<代码>字符串只是一个整数列表

8> B = [115,117,110,100,97,121].
"sunday"
9> is_list(B).
true
10> 
任何原子都是有效的“标识符”,因为它可以是Erlang和Elixir中函数的名称。然而,由于需要引用某些原子,您可能需要一些技巧来实际定义这样的函数

在Erlang中,引用:

如果原子不是以小写字母开头,或者它包含字母数字字符、下划线(_)或@以外的其他字符,则应将其括在单引号(')中

我找不到对长生不老药的类似描述,但我认为它是相似的

说明如何创建此类函数。简言之,在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}

这不是我要问的。我想知道原子是否可以用作函数名
foo
可以,而
'42'
不行。任何原子,包括
'42'
,都可以是函数名。@RyanStewart:很高兴知道。我在Elixir中找到了如何定义这样一个函数。这可能有点挑剔,但作为一种基本类型,我认为说“原子是一个常量值”比说“原子用来表示常量值”更准确。我们可以用
Fortytwo.42”(:a)
来称呼它。我想我想问的其实是“如何知道是否需要在函数名周围放置
“。现在我知道可能没有预定义的函数,因为它只与语法相关。啊,现在我明白你的要求了!据我所知,没有预定义的函数。一种稍微有点粗俗的方法是检查
inspect
返回的表示是否与原子本身匹配:
(inspect:foo)==(“:”atom.to_string:foo)