MoonScript - Agenda telefônica semifuncional em 101 linhas
Publicado por Ramon (última atualização em 02/12/2013)
[ Hits: 3.473 ]
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!
SearchSploit-GTK: Interface gráfica simples para o searchsploit (Kali Linux)
Crivo de Eratóstenes Simples em XBase (Clipper)
Verifica se o link caiu e manda aviso por email - MIkrotik v5.*
Dicas e truques Matematica Básica
Nenhum coment�rio foi encontrado.
O que é o THP na configuração de RAM do Linux e quando desabilitá-lo
Comparação entre os escalonadores BFQ e MQ-Deadline (acesso a disco) no Arch e Debian
Conciliando o uso da ZRAM e SWAP em disco na sua máquina
Servidor de Backup com Ubuntu Server 24.04 LTS, RAID e Duplicati (Dell PowerEdge T420)
Hardware antigo no Arch Linux e outras distribuições
Aprenda a proteger sua rede Wi-Fi!
Deixando o Plasma6 mais fluido no Linux
Como unir duas coleções de ROMs preservando as versões traduzidas (sem duplicatas)
Isso acontece com vcs também? (8)
Problema com audio apos upgrade (10)
Instalação automatizada do Debian 12 em UEFI (2)