2009-08-27

ufm: (Default)

что самая распространенная ошибка при программировании на erlang – передача в функцию не того параметра. Ну по крайней мере эта ошибка распространена сейчас среди меня. Что я имею в виду: допустим обрабатываем по цепочке данные. Как бы я это писал на Цэ:

tmt = 5;
tmt = fun1(tmt);
tmt = fun2(tmt);
tmt = fun3(tmt);

Как это приходится писать на эрланге

Tmt = 5,
Tmt1 = fun1(Tmt),
Tmt2 = fun2(Tmt1),
Tmt3 = fun3(Tmt2).

В результате достаточно в третьей строчке ошибиться и написать Tmt (при копипейстинге из другого места, реорганизации кода или просто опечататься) и ловить эту ошибку придется достаточно долго. Особенно когда переменная Tmt1 используется между функциями fun1 и fun2 – компилятор даже предупреждения не даст, что переменная нигде не используется.
Хотя, конечно, возможно это просто у меня с непривычки.

P.S. А постоянное слежение за тем, когда писать ‘,’ когда ‘;’ а когда вобще ничего – это отдельная песня. :)

Originally published at U.F.M's Homepage. Please leave any comments there.

ufm: (Default)

Но что прям так плохо будет – не ожидал.
L=lists:seq(1,20000000) – выжирает память как не в себя.

Вот это – тоже весело:

1> L=lists:seq(1,256).
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
23,24,25,26,27,28,29|...]
2> B=list_to_binary(L).
** exception error: bad argument
in function list_to_binary/1
called as list_to_binary([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
23,24,25,26,27,28|...])

ну и напоследок:

34> f().
ok
35> L=lists:seq(1,256).
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
23,24,25,26,27,28,29|...]

Crash dump was written to: erl_crash.dump
eheap_alloc: Cannot allocate 1425410620 bytes of memory (of type “heap”).
Aborted

Originally published at U.F.M's Homepage. Please leave any comments there.

ufm: (Default)

L=lists:seq(1,256).

Ага. Список. От 1 до 256. И как я 256 собрался в binary переводить?

Originally published at U.F.M's Homepage. Please leave any comments there.

ufm: (Default)

ufm@imac:~$ erl
Erlang (BEAM) emulator version 5.6.5 [source] [smp:2] [async-threads:0] [kernel-poll:false]

Eshell V5.6.5 (abort with ^G)
1> A=[255||X<-lists:seq(1,20000000)],ok.
ok
2> B=list_to_binary(A).
<<”\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377″…>>
3>
3> byte_size(B).
20000000
4> byte_size(B).
20000000
5> byte_size(B).
20000000

Crash dump was written to: erl_crash.dump
eheap_alloc: Cannot allocate 912262800 bytes of memory (of type “heap”).
Aborted

Originally published at U.F.M's Homepage. Please leave any comments there.