Literate programming: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m Bot: fix errori del modulo Citazione |
m tag source deprecati, replaced: <source lang= → <syntaxhighlight lang= (5), </source> → </syntaxhighlight> (5) |
||
Riga 43:
=== Creazione di macro ===
Il frammento seguente del literate program <code>wc</code><ref name="noweb-wc" /> mostra come frasi descrittive arbitrarie in un linguaggio naturale vengono utilizzate per creare macro, che fungono da nuovi "operatori" nel linguaggio di programmazione literate e nascondono blocchi di codice o altre macro. La notazione di markup è composta da parentesi quadre (" <code><<...>></code> ") che indicano le macro, il simbolo " <code>@</code> " che indica la fine della sezione di codice in un file noweb. Il simbolo " <code><<*>></code> " sta per "radice", nodo più in alto dal quale lo strumento di programmazione alfabetico inizierà a espandere la rete di macro. In realtà, scrivere il codice sorgente espanso può essere fatto da qualsiasi sezione o sottosezione (cioè un pezzo di codice designato come " <code><<name of the chunk>>=</code> ", con il segno uguale), quindi un file di un literate program può contenere diversi file con codice sorgente.
<
The purpose of wc is to count lines, words, and/or characters in a list of files. The
number of lines in a file is ......../more explanations/
Riga 61:
#include <stdio.h>
@
</syntaxhighlight>
Il dipanarsi dei blocchi può essere eseguito in qualsiasi posizione nel file di testo del programma letterato, non necessariamente nell'ordine in cui sono sequenziati nel blocco racchiudente, ma come richiesto dalla logica riflessa nel testo esplicativo che avvolge l'intero programma.
Riga 67:
Le macro non corrispondono ai "nomi di sezione" nella documentazione standard. Le macro nel literate programming possono nascondere dietro di sé qualsiasi blocco di codice ed essere utilizzate all'interno di qualsiasi operatore di linguaggio macchina di basso livello, spesso all'interno di operatori logici come " <code>if</code> ", " <code>while</code> " o " <code>case</code> ". Ciò è illustrato dal seguente frammento del literate program <code>wc</code>.<ref name="noweb-wc" />
<
The present chunk, which does the counting, was actually one of
the simplest to write. We look at each character and change state if it begins or ends
Riga 90:
}
@
</syntaxhighlight>
In effetti, le macro possono rappresentare qualsiasi frammento arbitrario di codice o altre macro e sono quindi più generali di una frammentazione top-down o bottom-up o di una sorta di sottosezionamento. Knuth dice che quando ha realizzato questo, ha iniziato a pensare a un programma come a una ''rete'' di varie parti.<ref name="TCJ_LP">{{Cita|Knuth}}.</ref>
Riga 97:
In un literate program noweb oltre all'ordine libero della loro esposizione, i blocchi dietro le macro, una volta introdotti con " <code><<...>>=</code> ", possono essere sviluppati successivamente in qualsiasi posto nel file semplicemente scrivendo " <code><<name of the chunk>>=</code> "e aggiungendo più contenuto ad esso, come illustra il seguente frammento (" più" viene aggiunto dal formatter del documento per la leggibilità e non è nel codice).<ref name="noweb-wc">{{Cita web|url=https://www.cs.tufts.edu/~nr/noweb/examples/wc.html|titolo=An Example of noweb|autore=Norman Ramsey|lingua=en|data=13 maggio 2008|accesso=4 gennaio 2009}}</ref>
<
If we made these variables local to main, we would have to do this initialization
explicitly; however, C globals are automatically zeroed. (Or rather,``statically
Riga 107:
/* total number of words, lines, chars */
@
</syntaxhighlight>
=== Registrazione del processo di ragionamento ===
Riga 129:
: I literate script possono essere testo sorgente LaTeX completo, e allo stesso tempo possono essere compilati, senza modifiche, perché l'interprete compila il testo solo in un ambiente di codice, ad esempio
: <
% here text describing the function:
\begin{code}
Riga 136:
\end{code}
here more text
</syntaxhighlight>
: Il codice può anche essere marcato nello stile Richard Bird, iniziando ogni riga con un simbolo maggiore di e uno spazio, precedendo e terminando il pezzo di codice con linee vuote.
* Il pacchetto di <code>listings</code> LaTeX fornisce un ambiente <code>lstlisting</code> che può essere utilizzato per abbellire il codice sorgente. Può essere utilizzato per definire un ambiente <code>code</code> da utilizzare all'interno di Haskell per stampare i simboli in modo simile a:
: <
\newenvironment{code}{\lstlistings[language=Haskell]}{\endlstlistings}
Riga 148:
(g `comp` f) x = g(f x)
\end{code}
</syntaxhighlight>
:può essere configurato per ottenere qualcosa simile a questo:
::<math>
| |||