erlang各种有用的函数包括一些有用nif封装,还有一些性能测试case。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

41 lines
1.5 KiB

преди 5 години
преди 5 години
преди 5 години
преди 5 години
преди 5 години
преди 5 години
преди 5 години
преди 5 години
преди 3 години
преди 5 години
преди 3 години
преди 5 години
преди 5 години
преди 5 години
преди 5 години
преди 5 години
преди 5 години
преди 5 години
преди 5 години
преди 3 години
  1. -module(utKvsToBeam).
  2. -export([
  3. load/2
  4. ]).
  5. %% 注意 map类型的数据不能当做key
  6. -type key() :: atom() | binary() | bitstring() | float() | integer() | list() | tuple().
  7. -type value() :: atom() | binary() | bitstring() | float() | integer() | list() | tuple() | map().
  8. -spec load(term(), [{key(), value()}]) -> ok.
  9. load(Module, KVs) ->
  10. Forms = forms(Module, KVs),
  11. {ok, Module, Bin} = compile:forms(Forms),
  12. code:soft_purge(Module),
  13. {module, Module} = code:load_binary(Module, atom_to_list(Module), Bin),
  14. ok.
  15. forms(Module, KVs) ->
  16. %% -module(Module).
  17. Mod = erl_syntax:attribute(erl_syntax:atom(module), [erl_syntax:atom(Module)]),
  18. %% -export([getV/0]).
  19. ExportList = [erl_syntax:arity_qualifier(erl_syntax:atom(getV), erl_syntax:integer(1))],
  20. Export = erl_syntax:attribute(erl_syntax:atom(export), [erl_syntax:list(ExportList)]),
  21. %% getV(K) -> V
  22. Function = erl_syntax:function(erl_syntax:atom(getV), lookup_clauses(KVs, [])),
  23. [erl_syntax:revert(X) || X <- [Mod, Export, Function]].
  24. lookup_clause(Key, Value) ->
  25. Var = erl_syntax:abstract(Key),
  26. Body = erl_syntax:abstract(Value),
  27. erl_syntax:clause([Var], [], [Body]).
  28. lookup_clause_anon() ->
  29. Var = erl_syntax:variable("_"),
  30. Body = erl_syntax:atom(undefined),
  31. erl_syntax:clause([Var], [], [Body]).
  32. lookup_clauses([], Acc) ->
  33. lists:reverse(lists:flatten([lookup_clause_anon() | Acc]));
  34. lookup_clauses([{Key, Value} | T], Acc) ->
  35. lookup_clauses(T, [lookup_clause(Key, Value) | Acc]).