MoonScript - Agenda telefônica semifuncional em 101 linhas
Publicado por Ramon (última atualização em 02/12/2013)
[ Hits: 3.050 ]
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!
Programação para sistemas embarcados em Assembly
Nenhum comentário foi encontrado.
Agora temos uma assistente virtual no fórum!!! (247)
Manutenção de sistemas Linux Debian e derivados com apt-get, apt, aptitude e dpkg
Melhorando o tempo de boot do Fedora e outras distribuições
Como instalar as extensões Dash To Dock e Hide Top Bar no Gnome 45/46
Como Atualizar Fedora 39 para 40
Instalar Google Chrome no Debian e derivados
Consertando o erro do Sushi e Wayland no Opensuse Leap 15
Instalar a última versão do PostgreSQL no Lunix mantendo atualizado
Flathub na sua distribuição Linux e comandos básicos de gerenciamento
Agora temos uma assistente virtual no fórum!!! (247)
iso de sistema 32 bit em atividade (12)
Como adicionar módulo de saúde da bateria dos notebooks Acer ao kernel... (27)