Adaptado no blog novo.Há muito pouco tempo atrás um amigo meu me sugeriu dar atenção à MoonScript. Admito que eu via a linguagem com preconceito, mesmo assim resolvi dar uma olhada.
Resultado: todos os meus códigos em Lua acabaram convertidos para MoonScript. :-)
A linguagem é extremamente enxuta, limpa e poderosa. Não vou entrar em detalhes, se estiver curioso, leia o guia da linguagem.
Mas também não puxei assunto por nada, vou dar alguns exemplos.
Paradigma Funcional
Para lidar com o paradigma funcional, a sintaxe de MoonScript é bem mais concisa e que a de Lua. Por exemplo, o combinador Y.
Lua é uma linguagem estrita e não suporta o combinador Y em sua forma lazy. Como MoonScript é compilado para código Lua, sofre do mesmo mal. Assim, é preciso usar o combinador Z, que é versão estrita do combinador Y.
O combinador Z é definido como:
Lua é uma linguagem estrita e não suporta o combinador Y em sua forma lazy. Como MoonScript é compilado para código Lua, sofre do mesmo mal. Assim, é preciso usar o combinador Z, que é versão estrita do combinador Y.
O combinador Z é definido como:
λf.(λx.xx)(λx.f(λv.xxv))
. Isso é facilmente representado em MoonScript:
Z = (f using nil) -> ((x) -> x x) (x) -> f (...) -> (x x) ...
Com isso é possível, por exemplo, implementar facilmente o quick sort:
Z = (f using nil) -> ((x) -> x x) (x) -> f (...) -> (x x) ...
tconcat = (...) -> [e for t in *{...} for e in *t]
Z (qsort using tconcat) ->
(xs) ->
if #xs <= 1
xs
else
x, xs = xs[1], [e for e in *xs[2,]]
lesser = [e for e in *xs when e <= x]
greater = [e for e in *xs when e > x]
tconcat (qsort lesser), {x}, (qsort greater)
Orientação a Objetos
Em Lua é preciso toda uma ginástica com metatabelas para simular eficientemente orientação a objetos. MoonScript tem suporte a classes na linguagem.
Por exemplo, podemos criar uma pilha (stack) facilmente:
Por exemplo, podemos criar uma pilha (stack) facilmente:
import bind_methods from assert require "moon"
class Stack
list: nil
set: (x) =>
@list =
next: @list
value: x
get: =>
v = nil
{value: v, next: @list} = @list if @list
v
bind_methods Stack!
LuaJIT
Como MoonScript compila para código Lua tradicional, você pode gerar código para virtualmente qualquer plataforma que rode Lua, como LuaJIT e LÖVE.
Por exemplo, você pode usar C-structs e metatipos:
Por exemplo, você pode usar C-structs e metatipos:
ffi = assert require "ffi"
import sqrt from math
ffi.cdef [[
typedef struct { double x, y; } point_t;
]]
local Point = ffi.metatype "point_t",
__add: (o) => Point @x + o.x, @y + o.y
__len: => @\hypot!
__tostring: => "(#{@x}, #{@y})"
__index:
area: => @x * @y
hypot: => sqrt @x*@x + @y*@y
Point
bash$ luajit
LuaJIT 2.0.3 -- Copyright (C) 2005-2014 Mike Pall. http://luajit.org/
JIT: ON CMOV SSE2 SSE3 SSE4.1 fold cse dce fwd dse narrow loop abc sink fuse
> moon = assert(require "moonscript.base")
> Point = (moon.loadfile "point.moon")()
> p = Point(3, 4)
> = tostring(p)
(3, 4)
> = p:area()
12
> = #p
5
>
Bem, acho que já fiz propaganda suficiente da linguagem. ;-)
[]’s