Erlang文档提供了complete list of operators with precedence and associativity。
表格中的前两个运算符:
和#
似乎没有在文档中的任何其他位置进行描述。从技术上讲,#
看起来像地图更新表达式中的二元运算符,但这不是很清楚。我没有看到:
运营商的描述,但可能错过了一些东西。
有没有人对:
和#
运营商有用的技术说明? (我开始查看Erlang Grammar,但结果超过700次,搜索非常困难。)
答案 0 :(得分:2)
对我来说,它只返回14次,远远少于700次:)
:~/otp/lib/stdlib/src % cat erl_parse.yrl | grep "':'"
'(' ')' ',' '->' '{' '}' '[' ']' '|' '||' '<-' ';' ':' '#' '.'
spec_fun -> atom ':' atom : {'$1', '$3'}.
spec_fun -> atom ':' atom '/' integer '::' : {'$1', '$3', '$5'}.
type -> atom ':' atom '(' ')' : {remote_type, ?anno('$1'),
type -> atom ':' atom '(' top_types ')' : {remote_type, ?anno('$1'),
bin_base_type -> var ':' type : build_bin_type(['$1'], '$3').
bin_unit_type -> var ':' var '*' type : build_bin_type(['$1', '$3'], '$5').
expr_800 -> expr_max ':' expr_max :
opt_bit_size_expr -> ':' bit_size_expr : '$2'.
bit_type -> atom ':' integer : { element(3,'$1'), element(3,'$3') }.
fun_expr -> 'fun' atom_or_var ':' atom_or_var '/' integer_or_var :
try_clause -> atom ':' expr clause_guard clause_body :
try_clause -> var ':' expr clause_guard clause_body :
inop_prec(':') -> {900,800,900};
:~/otp/lib/stdlib/src % cat erl_parse.yrl | grep "':'" | wc -l
14
此外:
:~/otp/lib/stdlib/src % cat erl_parse.yrl | grep "'#'"
'(' ')' ',' '->' '{' '}' '[' ']' '|' '||' '<-' ';' ':' '#' '.'
type -> '#' '{' '}' : {type, ?anno('$1'), map, []}.
type -> '#' '{' map_pair_types '}' : {type, ?anno('$1'), map, '$3'}.
type -> '#' atom '{' '}' : {type, ?anno('$1'), record, ['$2']}.
type -> '#' atom '{' field_types '}' : {type, ?anno('$1'),
map_expr -> '#' map_tuple :
map_expr -> expr_max '#' map_tuple :
map_expr -> map_expr '#' map_tuple :
record_expr -> '#' atom '.' atom :
record_expr -> '#' atom record_tuple :
record_expr -> expr_max '#' atom '.' atom :
record_expr -> expr_max '#' atom record_tuple :
record_expr -> record_expr '#' atom '.' atom :
record_expr -> record_expr '#' atom record_tuple :
inop_prec('#') -> {800,700,800};
-type pre_op() :: 'catch' | '+' | '-' | 'bnot' | 'not' | '#'.
preop_prec('#') -> {700,800}.
-type type_preop() :: '+' | '-' | 'bnot' | '#'.
type_inop_prec('#') -> {800,700,800}.
type_preop_prec('#') -> {700,800}.
这些信息并没有比erl_parse.yrl
更好的地方。 That's not my opinion BTW。
答案 1 :(得分:2)
他们都不是合适的运营商。这里的文档有误导性。 #字符用于base-N-literals,如16#ffff,但它在词法层面,在记录和映射的语法中,但不是作为实际的运算符。 :字符用于远程调用,如列表:reverse(Xs),但同样,它不是真正的运算符 - “lists:reverse”本身不是带有值的子表达式。