2010-10-08 5 views
8

Amo Lua, utilizzandolo per un numero sempre maggiore di progetti come lingua principale (non incorporata). Il mio attuale progetto si avvicina a 10.000 linee e probabilmente finirà con circa 15.000 linee. Cosa hai trovato utile quando si sviluppa in Lua a quella scala? Su cosa hai sbattuto la testa e quali soluzioni hai trovato? Sto pensando a strumenti di sviluppo, funzionalità linguistiche tecniche &, moduli di terze parti?Cosa renderebbe più semplice lavorare davvero con Lua?

mia top 3:

  1. strict.lua - io uso una versione modificata di questa. Sarei impazzito senza essere allertato per accedere a variabili inutilizzate/non intenzionali.

  2. coroutine - non per la loro capacità di multithreading, ma per la loro continuità. Molto utile per semplificare l'implementazione di macchine a stati.

  3. funzione di serializzazione - indispensabile per il dumping del contenuto della tabella e per le tabelle persistenti su disco (lo uso molte volte quando altrimenti avrei probabilmente raggiunto un database).

La mia lista:

  1. visivo debugger per OS X. Sto usando print() s ora, ma un debugger che mi avrebbe lasciato un solo passo attraverso file di origine sarebbe grande.

  2. Un estratto conto. Usando la ripetizione ... fino a quando la vera soluzione è brutta, e troppi if se nidificati diventano complessi e brutti.

  3. Un metametodo richiamato quando un membro di tabella esistente viene modificato.

Altri suggerimenti per lo sviluppo di Lua su larga scala?

risposta

6

Un estratto conto. Usando la ripetizione ... finché la vera soluzione alternativa è orribile, e troppi if if nidificati diventano complessi e brutti.

Fare in modo che il corpo del ciclo sia una chiamata di funzione; quindi return diventa continue.

Un metodo che viene richiamato quando viene modificato un membro di tabella esistente .

È possibile implementare questo corpo utilizzando una tabella di procura B che memorizza tutti i dati effettivi per la tabella A - i metamethods NewIndex/indice su un'intercettazione scrive/legge e modificare/ricerca dalla tabella B, invece. Dal momento che A non ottiene mai nulla di scritto, tutte le scritture colpiscono newindex.

+0

Sfortunatamente, questo non funziona molto bene per le tabelle annidate. Ho creato una 'funzione' ricorsiva che verifica se il nuovo valore è una' table', e imposta anche il suo 'metatable' su questa stessa' funzione', quindi posso collegarla. Il problema è, cosa fare quando è un altro 'tipo primitivo'? Ho due tabelle nidificate e una 'stringa' in una delle tabelle interne che è indicizzata da' "ragione" ', come rilevare le modifiche in quella' stringa' fornito il valore iniziale prima che la modifica non fosse 'nil'? – henry700

+0

OH! Devo solo implementare questo proxy programmaticamente! – henry700

3

In base alle vostre top3 e desiderio liste, ecco i prodotti che ho lavorato e posso consigliare (almeno in base al feedback ricevuto):

  1. MobDebug: un debugger remoto basato su RemDebug, ma con una varietà di correzioni e nuove funzioni.
  2. ZeroBrane Studio: un IDE Lua che fornisce un debugger con tutte le funzioni previste (StepIn/Over/Out, Break, Watch, Stack, Breakpoint, shell remota, supporto di serializzazione, supporto di coroutine e altro) e funziona su OSX e Windows. Fornisce un'integrazione perfetta con MobDebug nell'IDE. Ho pubblicato diversi screencast mostrandoli in azione: http://notebook.kulchenko.com/zerobrane/live-coding-in-lua-bret-victor-style, http://notebook.kulchenko.com/zerobrane/love2d-debugging.
  3. Serpent: un serializzatore compatto e potente. ZeroBrane Studio utilizza Serpent per visualizzare strutture di dati complesse nelle finestre Console e Stack.
  4. ZeroBrane Studio include uno static analyzer (basato su metalua e lua-inspect), che consente di rilevare gli stessi problemi (e altri) rilevati da strict.lua, ma durante lo sviluppo (prima di eseguire il codice).
  5. In termini di visualizzazione delle modifiche, MobDebug fornisce un modo per farlo per qualsiasi tipo di variabile (non solo tabella). L'ho descritto in un altro SO post. Questa funzionalità non è ancora disponibile tramite ZeroBrane Studio.