Erlang “二郎”;“非法保护表达”;在警卫中使用函数时
我有以下代码。我正在检查3个条件。您可以看到,对于第一个条件,我将Erlang “二郎”;“非法保护表达”;在警卫中使用函数时,erlang,Erlang,我有以下代码。我正在检查3个条件。您可以看到,对于第一个条件,我将xml:get\u tag\u attr\u s(…)的输出存储在变量中,然后在if块中使用该变量。我的问题是,如果我尝试在一行中执行上述过程,就像在其他两个条件下一样,我会得到错误非法的保护表达式 另外,我从默认条件中得到了变量'\uu'是未绑定的。应该是一样的 谁能解释一下这个问题吗 validate_xmpp(Packet) -> Type = xml:get_tag_attr_s(list_to_bina
xml:get\u tag\u attr\u s(…)
的输出存储在变量中,然后在if块中使用该变量。我的问题是,如果我尝试在一行中执行上述过程,就像在其他两个条件下一样,我会得到错误非法的保护表达式
另外,我从默认条件中得到了变量'\uu'是未绑定的
。应该是一样的
谁能解释一下这个问题吗
validate_xmpp(Packet) ->
Type = xml:get_tag_attr_s(list_to_binary("type"), Packet),
if
(Type /= <<"chat">> ->
{error, "Message type is not chat"};
xml:get_path_s(Packet, [{elem, list_to_binary("body")}, cdata]) /= <<"">> ->
{error, "No or empty body"};
exml_query:path(Packet, [{element,<<"received">>},{attr,<<"xmlns">>}]) == <<"urn:xmpp:receipts">> ->
{error, "delivery-receipts should be ignored"};
_->
{ok, xml:get_tag_attr_s(list_to_binary("from"), Packet)}
end.
validate\u xmpp(数据包)->
Type=xml:get_tag_attr_s(list_to_binary(“Type”),数据包),
如果
(类型/=->
{错误,“消息类型不是聊天”};
xml:get_path_s(数据包,[{elem,list_to_binary(“body”)},cdata])/=->
{错误,“无正文或空正文”};
exml_查询:路径(数据包,[{element,},{attr,}])==->
{错误,“应忽略交货收据”};
_->
{好的,xml:get_tag_attr_s(list_to_binary(“from”),Packet)}
结束。
Erlang只允许这些保护:
- 原子
true
- 其他常量(术语和绑定变量),均视为false
- 调用表类型测试BIFs中指定的BIFs(内置函数)
有关更多信息,请查看
使用true
而不是。if
不能在中使用
,只能在case
语句中使用,还可以查看
这将导致非法的保护错误
在第一次阅读时,它似乎包含一个“术语比较”:
和一个“算术表达式”:
此外,如果您使用代码,您将看到警卫:
B > A+2
是合法的。那么“算术表达式”math:sqrt(A)
和A+2
之间有什么区别呢
将“算术表达式”定义为:`
值得注意的是,math:sqrt()
不在“算术表达式”列表中。因此,math:sqrt(A)
是一个“函数调用”,而不是一个“算术表达式”,并且您只能在一个保护中调用一定数量的函数,即列出的“类型测试BIF”,例如:
is_integer/1
is_float/1
is_binary/1
is_list/1
is_map/1
is_function/1
etc.
可能是和的重复。谢谢!变量“\u1”是我得到的未绑定错误吗?
math:sqrt(A)
B > A+2
+
-
*
/
div
rem
bnot
band
bor
bxor
bsl
bsr
is_integer/1
is_float/1
is_binary/1
is_list/1
is_map/1
is_function/1
etc.