Skip to main content

This is my blog, more about me at marianoguerra.github.io

🦋 @marianoguerra.org 🐘 @marianoguerra@hachyderm.io 🐦 @warianoguerra

Viva vim (y erlang)

este post tiene doble intencion, primero, mostrar un poco de codigo de erlang que escribi, para que los que no lo conocen, lo conoscan. Segundo para demostrar la potencia de vim.

bueno, primero vamos con el codigo, que basicamente son dos modulos que escribi para multiplicacion de matrices de tamaño variable.

archivo row.erl (manejo de filas, creacion con un valor, creacion con valores aleatorios, multiplicacion de filas):



 1 -module(row).

 2 -export([new/2, new_random/3, multiply/2]).

 3

 4 new(Length, Value) -> new(Length, fun() -> Value end, []).

 5 new_random(Length, Start, Stop) -> 

 6     new(Length, fun() -> random:uniform() * (Stop - Start) + Start end, []).

 7

 8 new(0, _Fun, R) -> R;

 9 new(Length, Fun, R) -> new(Length - 1, Fun, [Fun()|R]).

10

11 multiply(R1, R2) -> multiply(R1, R2, 0).

12

13 multiply([], [], N) -> N;

14 multiply([R1H|R1T], [R2H|R2T], N) -> multiply(R1T, R2T, N + R1H * R2H).

15

Generated with VIM(http://www.vim.org, tip #1174)



archivo matrix.erl, maneja lo mismo que el anterior pero para matrices:



 1 -module(matrix).

 2 -export([new/3, new_random/4, head/1, tail/1, multiply/2]).

 3

 4 new(Rows, Cols, Val) -> 

 5     new(Rows, Cols, fun() -> row:new(Cols, Val) end, []).

 6

 7 new_random(Rows, Cols, Start, Stop) ->

 8     new(Rows, Cols, fun() -> row:new_random(Cols, Start, Stop) end, []).

 9

10 new(0, _Cols, _Fun, M) -> M;

11 new(Rows, Cols, Fun, M) -> new(Rows - 1, Cols, Fun, [Fun()|M]).

12

13 head(M) -> head(M, []).

14

15 head([], MH) -> lists:reverse(MH);

16 head([[H|_]|T], MH) -> head(T, [H|MH]).

17

18 tail(M) -> tail(M, []).

19

20 tail([], MT) -> lists:reverse(MT);

21 tail([[_|RT]|T], MT) -> tail(T, [RT|MT]).

22

23 multiply(A, B) -> multiply(A, B, []).

24

25 multiply([], _B, M) -> lists:reverse(M);

26 multiply([AH|AT], B, M) -> multiply(AT, B, [multiply_row(AH, B)|M]).

27

28 multiply_row(R, M) -> multiply_row(R, M, []).

29

30 multiply_row(_R, [[]|_], N) -> lists:reverse(N);

31 multiply_row(R, M, N) -> 

32     multiply_row(R, tail(M), [row:multiply(R, head(M))|N]).

33

Generated with VIM(http://www.vim.org, tip #1174)


como hacerlo esta descripto en la firma del codigo, basicamente pegar el codigo que aparece ahi en tu ~/.vimrc, abri el archivo que queres, entras en modo visual, seleccionas la parte que te interesa y apretas :MyToHtml, y te genera el html.

voy a ver si arreglo el css del blog para que las lineas no salgan tan separadas

un codigo de ejemplo para esa lib:

3> row:new(5,0). % crea una fila con 5 elementos seteados en 0
[0,0,0,0,0]

5> R1 = row:new_random(5,1,5). % crea una fila con 5 elementos random entre 1 y 5
[2.90848,3.66783,4.66262,3.38979,2.24531]

6> R2 = row:new_random(5,1,5). % crea una fila con 5 elementos random entre 1 y 5
[1.63925,3.78856,1.83779,1.56843,3.38604]

7> row:multiply(R1, R2). % multiplica R1 y R2
40.1518

8> M1 = matrix:new_random(4,3,1,5). % crea una matrix de 4x3 con valores entre 1 y 5
[[4.95718,3.31525,1.23460],
[2.23877,2.60385,2.90309],
[3.24848,1.02369,2.68560],
[2.83170,1.85989,3.23302]]

10> M3 = matrix:new_random(3,2,1,5). % crea una matrix de 4x3 con valores entre 1 y 5
[[2.55555,3.43706],[3.24636,4.95171],[1.21720,1.19310]]

11> matrix:multiply(M1, M3). % las multiplica
[[24.9336,34.9273],[17.7079,24.0519],[14.8938,19.4384],[17.2097,22.7997]]