Я пытаюсь заменить следующую функцию на что-то более элегантное:
split_packet(_, <<>>) ->
[];
split_packet(Size, P) when byte_size(P) < Size ->
[ P ];
split_packet(Size, P) ->
{Chunk, Rest} = split_binary(P, Size),
[ Chunk | split_packet(Size, Rest) ].
(я теперь это не хвостовая рекурсия - хотел бы сделать это простым, к тому же это не имеет значения для производительности вболее новые версии Erlang)
Пример вывода:
1> split_packet(3, <<1,2,3,4,5,6,7,8>>).
[<<1,2,3>>,<<4,5,6>>,<<7,8>>]
Было бы предпочтительнее элегантное решение с использованием списков, поскольку результат этого дополнительно обрабатывается с использованием списков, которые затем можно обернуть водно понимание.
Я пытался
[ X || <<X:Size/binary>> <= P ].
, но это исключает последний кусок, если размер не кратен byte_site(P)
:
2> [ X || <<X:3/binary>> <= <<1,2,3,4,5,6,7,8>> ].
[<<1,2,3>>,<<4,5,6>>]