Vorrei sottoporvi un interessante, piccolo/grande modo di risolvere i problemi di tutti i giorni.
No, non useremo newLisp per evitare che i toast la mattina non si brucino
ma vedremo un altro esempio su come usare newLisp per sostituire efficacemente lo scripting shell (tipicamente bash, zsh, csh, etc… per Linux/Un*x).
Un paio di giorni fà mi sono ritrovato con un piccolo/grande problema: avevo moltissimi files C divisi in diverse sottodirectories, e dovevo cercarne alcuni che contenessero una determinata funzione.
Mi sono affidato quindi al buon vecchio cat unito al grep, nel modo seguente:
cat *.c | grep miaFunzione
Purtroppo questo sistema funziona se non devo fare ricerche anche nelle sottodirectories.
Ho quindi cercato soluzioni alternative. Ne ho trovate alcune, ma non sempre mi hanno funzionato (delle volte è difficile trovare qualcosa su internet se non si sà bene che chiavi di ricerca usare!).
Allora ho pensato di realizzare ciò che mi serviva usando newLisp! La domanda era però: posso fare in newLisp uno script abbastanza breve da poter essere usato come valida alternativa alla bash e ai suoi potentissimi comandi (comprese le pipes, redirezioni, etc…)?
Bè, dopo alcuni minuti di riflessione la risposta è stata… SI! Ed ecco cosa è uscito fuori:
(dolist (i (exec "ls *.c")) (println (exec (string "cat -n " i " | grep miaFunzione") ) ) )
Lo script è comunque molto corto, sfrutta le potenzialità dei comandi ls, grep e cat ma ho usato newLisp come collante tra loro.
Si può anche usare l’elegante e potente funzione map e le lamba functions come segue:
(map (fn (i) (exec (string "cat -n " i " | grep miaFunzione") ) ) (exec "ls *.c") )
La lunghezza dello script è simile al precedente, ma in questo modo non si effettuano cicli (dolist). Inoltre la funzione lambda può essere tranquillamente sostituita con altre funzioni che operano su liste di files… e qui solo la fantasia è il vero limite!
Ora spieghiamo velocemente i due script. Partiamo dal primo.
Prima di tutto scriviamolo in una forma più leggibile:
(dolist (i (exec "ls *.c") )
(println
(exec (string "cat -n " i " | grep miaFunzione") )
)
)
La funzione exec esegue un programma esterno all’interprete newLisp (in questo caso esegue ls *.c), e ritorna il risultato come lista di dati. Ecco un esempio:
> (exec "ls *.lsp")
("demo.lsp" "editor.lsp")
Con la funzione dolist scorro la lista così ottenuta, e compongo il secondo comando, usando cat (stampa i contenuti di un file di testo) e grep (ricerca una stringa all’interno del testo emesso da cat).
Nel secondo esempio – usando la funzione map – invece ho creato una lambda function, la quale riceve la lista di file, uno ad uno, grazie alla funzione map.
L’esempio con la map credo sia più elegante ed infinitamente più flessibile. Per esempio potrei crearmi delle funzioni che effettuino filtri o operazioni particolari su gruppi di files. Allo scopo potrei costruirmi due set di funzioni: una che legge i dati in un determinato modo, mentre il secondo blocco potrebbe effettuare le più disparate operazioni su di essi.
Vedremo in futuro un’applicazione pratica di tutto ciò. Per ora… arrivederci!
Translate To English!
Commenti Recenti