terça-feira, 28 de novembro de 2006

Ruby

Estou aprendendo ruby, e estou achando ele uma linguagem muito legal. Gosto principalmente dos codeblocks, mas é interessante que por mais features que se adiciona em uma linguagem sempre fica uma que vc gosta de fora.

Algo que eu sinto muita falta é o REDUCE do lisp, veja este código em LISP:

(reduce #'max (mapcar #'parse-integer (split-sequence #Space "3 42 1")))


Não existe maneira mais elegante de splitar uma string e pegar a maior dos elementos. Ruby chega quase lá:

"3 42 1".split(" ").map {|x| x.to_i }


Consigo splitar e transformar em inteiros, porém, para achar o máximo eu tenho que usar uma variável a mais e fazer um código muito mais deselegante:


lst="3 42 1".split(" ").map {|x| x.to_i }
max=-1
lst.each do |x|
if (x > max)
max = x;
end
end

print max,"n"


Uma pena.

4 comentários:

Walter Cruz disse...

Em python dá pra fazer quase tão bonito quanto.

maior = reduce(max, ([int(numero) for numero in "500 901 101 3 42 1".split()]))
print(maior)

Walter Cruz disse...

E com um pouquinho de paciência, a versão em ruby traduzida da versão em python:

puts ("3 42 1".split(" ").map {|x| x.to_i }).max

Leonardo Varuzza disse...

Legal saber do max no ruby, não tinha achado na documentação. Ainda assim não é tão genérico quanto o Reduce, mas Ruby é legal mesmo assim.

djogo disse...

Um sujeito propoe a implementacao de reduce em ruby:

http://www.xs4all.nl/~hipster/lib/ruby/reduce

existe o reduce em PHP, mas a linguagem nao ajuda nem um pouco...

$a = explode( " ","3 42 1" );
$b = array_reduce( $a, "max" );