问题描述
我正在尝试制作这样的功能
.Date
X 应该是一个包含三个元素的元组,第一个是描述。其他值可以是整数,也可以是原子 a 或 b,或另一个元组。第二个参数应该是一个映射,它将 X 中的任何潜在原子 a 或 b 映射到一个值。示例输入可以是
eval(X,Map = #{}) ->
%% expression
.
eval({add,a,b},#{a => 1,b => 2})
eval({add,2},#{a => 1})
我终其一生都无法找到一种方法来使用 Map,将 X 中的任何潜在原子 a 或 b 映射到输入中给定的值。任何人都有关于如何实现的建议,以便将任何原子 a 或 b 映射到 Map 中给出的值?
解决方法
正如 Map pattern matching in function head 上的其他人所建议的那样(尽管这个问题的描述要清晰得多),您正在寻找的是……
Traceback (most recent call last):
File "DeviceServerRequester.py",line 38,in <module>
main()
File "DeviceServerRequester.py",line 35,in main
r.ask()
File "DeviceServerRequester.py",line 20,in ask
self.sock.connect(self.address)
OSError: [Errno 9] Bad file descriptor
,
修改@BrujoBenavides 已发布的答案以处理嵌套元组:
eval({Op,a,b},#{a := A,b := B}) ->
eval(Op,A,B);
eval({Op,B},#{a := _} = Map) when is_integer(B) ->
eval({Op,Map#{b => B});
eval({Op,Expr},#{a := _} = Map) ->
B = eval(Expr,Map),eval({Op,#{b := _} = Map) when is_integer(A) ->
eval({Op,Map#{a => A});
eval({Op,Expr,#{b := _} = Map) ->
A = eval(Expr,_) when is_integer(A),is_integer(B) ->
eval({Op,#{a => A,b => B});
eval({Op,Expr1,Expr2},#{} = Map) ->
%% need to evaluate Expr1 and Expr2 before Op
A = eval(Expr1,B = eval(Expr2,Map#{a => A}),Map#{a => A,b => B}).
eval(add,B) ->
A+B;
eval(sub,B) ->
A - B;
eval(mul,B) ->
A * B;
eval('div',B) ->
A div B.