2012-02-02 8 views
22

Recentemente mi sono trovato a lavorare con il codice R che si trova su tutta la mappa in termini di stile di codifica: più autori e singoli autori che non sono rigorosi nel rispettare una singola struttura. Ci sono alcuni compiti che mi piacerebbe automatizzare meglio di quello che faccio attualmente.Strumenti di riformattazione/rifattorizzazione del codice a conoscenza del linguaggio R?

Sto cercando uno strumento (o strumenti) che gestisca i seguenti compiti - elencati in ordine crescente di desiderio ma anche un po 'in ordine crescente di scetticismo sull'esistenza.

  • Formattazione di base. Cose come convertire "if (foo)" in "if (foo)" e raggiungere l'uniformità in termini di posizione del tutore e quel genere di cose.

  • Conversione di "foo $ blah" in "foo [[" blah "]]" per l'accesso all'elenco. Idealmente sarebbe in grado di fare almeno un'ipotesi se un oggetto fosse davvero un elenco e non un data.frame e solo liste di conversione.

  • Conversione da '=' a '< -'. Sì, questa è una semplice ricerca e sostituzione - ma non proprio. Lo strumento (o regexp) deve essere in grado di riconoscere la lingua in modo che sappia convertire "x = 5" ma non "foo (x = 5)". Sarebbe anche molto bello non semplicemente sostituire il simbolo, ma anche assicurare uno spazio bianco singolo su entrambi i lati dell'operatore di assegnazione.

  • Rinominazione variabile, in particolare tra le funzioni & file. Per esempio, supponiamo che una lista abbia un elemento "foo", mi piacerebbe poterlo cambiare in "foobar" una volta e non dover rintracciare ogni utilizzo di quella lista nell'intero flusso di codice. Immagino che ciò richiederebbe che lo strumento fosse in grado di controllare l'intero flusso di controllo al fine di identificare cose come quella lista esistente come un altro nome in una funzione diversa.

  • Convenzioni di denominazione. Mi piacerebbe essere in grado di definire alcune convenzioni di denominazione standard (ad esempio Google's o qualsiasi altra cosa) e farlo identificare tutte le funzioni, le variabili, ecc. E convertirle. Si noti che questo si collega con la voce precedente per cose come gli elementi della lista.

Sentitevi liberi di elencare i comandi di base di elaborazione UNIX (ad esempio, sed) fintanto che sarà davvero essere abbastanza intelligente per almeno solito non avvitare le cose (per esempio la conversione di "foo (x = 5)" a " pippo (x < -5) ").

Sto indovinando che se un tale strumento già esistente in uno stato perfetto che avrei sentito parlare, ormai, e sto anche rendersi conto che con una lingua come R è difficile fare un po 'di questi tipi di cambiamenti automagicamente, ma si può sognare, giusto? Qualcuno ha dei suggerimenti su alcuni/tutti questi?

+2

riformattazione è stato discusso qui: http://stackoverflow.com/questions/5117359/any-r-style-guide-checker –

+4

IIRC 'formatR' è un pacchetto che pulisce Codice R e copre alcuni punti nella tua lista. – baptiste

+1

Il secondo obiettivo potrebbe essere un po 'confuso: un data.frame restituisce VERO per 'is.list()'. Si potrebbe provare qualcosa come 'is.list (myObject) e (! Is.data.frame (myObject))'. – Iterator

risposta

2

IMHO, scrivi il tuo. Scrivere una bella stampante è in realtà abbastanza difficile. Richiede la comprensione di tokenizing, l'analisi, la creazione di AST o altri IR, il tracciamento di tabelle di simboli e ambiti, modelli, ecc.

Ma se lo si può fare, imparerete davvero molto sulla programmazione dei linguaggi in generale. Avrai anche un aspetto piuttosto impressionante per i tuoi colleghi ed è sorprendente mettere su un curriculum. È anche molto divertente.

Vorrei raccomandare "Language Implementation Patterns: Create Your Own Domain-Specific and General Programming Languages" di Terence Parr. È un po 'difficile da leggere, ma il contenuto è abbastanza buono. È scritto a livello introduttivo per i parser ed è piuttosto breve, ma contiene tutte le parti di cui avresti bisogno per scrivere questo strumento tu stesso.

Se lo costruisci, apri il codice sorgente, torna qui e parlaci e crea un sito con pochi annunci per farti qualche soldo. In questo modo tutti possono usare la tua fantastica creazione e otterrai alcuni dollari nel processo.

Buona fortuna ...

+0

Costruisco prettyprinter accurati del linguaggio per dozzine di lingue facendo esattamente quello che dici (beh, io uso DMS invece di ANTLR). Posso dirti dall'amara esperienza che, a meno che il tuo formattatore includa tutte le opzioni di formattazione immaginabili, sia gratuito e funzioni su Mac/Linux/Windows, le persone lo sbattano per tutte queste ragioni. Buona fortuna, davvero. –

+0

Mi dispiace per questo. Le persone possono essere zoppo a volte. Sareste d'accordo, tuttavia, che è un esercizio di programmazione utile per l'apprendimento? A proposito, Ira è uno dei padrini dei parser e delle traduzioni linguistiche. La sua opinione ha più peso di Gates o Torvalds su questo argomento. Onestamente. – Homer6

+0

Ira, hai altri consigli sui libri? – Homer6

Problemi correlati