MoonScript - Agenda telefônica semifuncional em 101 linhas
Publicado por Ramon (última atualização em 02/12/2013)
[ Hits: 3.426 ]
O MoonScript é uma "linguagem" de programação, que faz cross-compile (ou seja, traduz seu código) para Lua (sim, a linguagem brasileira, usada no WoW). Porém, uma maneira de descrevê-la melhor é uma linguagem que faz algo como o CoffeeScript faz com o JavaScript.
Para testar a funcionalidade da linguagem, a testei fazendo uma mini-agenda-telefônica (quebrada, só adiciona contatos...) para ver se ela é "boa mesmo", e rendeu em surpreendentes 101 linhas um programa funcional.
Ah, só mais uma coisa. Olhe a TreeView. Quem já programou em GTK sem o Builder, e usou TreeViews, alguma vez ficará boquiaberto.
require "moon.all" lgi = require "lgi" import Gtk, GObject from lgi require "lsqlite3" -- General program logic PhoneColumns = { NAME: 1, NUMBER: 2 } database = sqlite3.open "database.db" assert(database\exec("CREATE TABLE IF NOT EXISTS phones(name text, number text)") == sqlite3.OK) -- Insert Window Logic -- Yep, classes - neat! class InsertWindow new: (db, on_add_callback) => @name_input = Gtk.Entry! @number_input = Gtk.Entry! @database = db @on_add_callback = on_add_callback @window = Gtk.Window { title: "Insert", Gtk.Grid { orientation: Gtk.Orientation.VERTICAL, Gtk.Grid { orientation: Gtk.Orientation.HORIZONTAL, Gtk.Label {label: "Name: "}, @name_input }, Gtk.Grid { orientation: Gtk.Orientation.HORIZONTAL, Gtk.Label {label: "Number: "}, @number_input }, Gtk.Button { label: "Insert", on_pressed: -> stmt = @database\prepare "INSERT INTO phones VALUES(?, ?)" stmt\bind(1, @name_input.text) stmt\bind(2, @number_input.text) stmt\step! stmt\reset! @window\hide! @on_add_callback! } } } clear: => @name_input.text = "" @number_input.text = "" -- Main Window Logic fill_liststore_with_data = (database, store using nil) -> store\clear! for row in database\nrows("SELECT * FROM phones") store\append { [PhoneColumns.NAME]: row.name, [PhoneColumns.NUMBER]: row.number } store = Gtk.ListStore.new { [PhoneColumns.NAME]: GObject.Type.STRING, [PhoneColumns.NUMBER]: GObject.Type.STRING } insert_window = InsertWindow(database, -> fill_liststore_with_data(database, store)) fill_liststore_with_data(database, store) view = Gtk.TreeView { model: store, Gtk.TreeViewColumn { title: "Name", { Gtk.CellRendererText({}), { text: PhoneColumns.NAME } } }, Gtk.TreeViewColumn { title: "Number", { Gtk.CellRendererText({}), { text: PhoneColumns.NUMBER } } } } button = Gtk.Button { label: "Insert contact", on_pressed: -> insert_window.window\show_all() } window = Gtk.Window { title: "Test", on_destroy: Gtk.main_quit, Gtk.Grid { orientation: Gtk.Orientation.VERTICAL, view, button } } window\show_all! Gtk.main!
Dicas e truques Matematica Básica
Crivo de Eratóstenes Simples em XBase (Clipper)
Nenhum coment�rio foi encontrado.
Atualizando o Passado: Linux no Lenovo G460 em 2025
aaPanel - Um Painel de Hospedagem Gratuito e Poderoso
O macete do Warsaw no Linux Mint e cia
Visualizar arquivos em formato markdown (ex.: README.md) pelo terminal
Dando - teoricamente - um gás no Gnome-Shell do Arch Linux
Como instalar o Google Cloud CLI no Ubuntu/Debian
Mantenha seu Sistema Leve e Rápido com a Limpeza do APT!
Procurando vídeos de YouTube pelo terminal e assistindo via mpv (2025)
Jogos baixados na Central de Aplicativos mas que não abrem (1)
debian com wayland, configuracao de teclado. Mudou Tudo! [RESOLVIDO] (1)
Iinstalar o Scanner Kodak i940 no Linux Mint 19/20? (3)
Pastas da raiz foram para a área de trabalho [RESOLVIDO] (11)