In "Logic for Mathematicians" di J. Barkley Rosser utilizza una notazione per evitare troppe parentesi. Anche se non so quando i logici iniziano a usare questa notazione, ma so che quel libro pubblicato per la prima volta nel 1957 e lo J. G. P. Nicod's paper pubblicato nel 1916 usa anche questa notazione. Quindi, ovviamente, ha una storia piuttosto lunga, sebbene al giorno d'oggi questo non sia favorito dai logici moderni.Sfida di analisi: notazione punto vecchio logico
Nel mondo della programmazione, nei linguaggi di programmazione simili a LISP c'è una grande sfida per i programmatori di tenere traccia della quantità giusta (enorme!) Di parentesi. Haskell fornisce un operatore $
che fornisce parte delle funzionalità, ma dal momento che non si può dire 2 * $ 3 + 4
non è potente come i punti (vedi esempi sotto). I periodici in linguaggio C utilizzano una precedenza di operazione convenzionale, ma in alcuni casi sono ancora necessarie parentesi annidate profonde. Quindi mi chiedo perché nessuna lingua reale usa questa strategia? Ci ho provato, ma non ho trovato nemmeno in grado di scrivere una grammatica per questo!
Lasciami mostrare alcuni esempi di un linguaggio di calcolatrice giocattolo con solo due operatori +
e *
e tutti i termini sono numeri interi.
Con questa notazione, un traduttore deve superare i seguenti casi di test:
1 + 3 .* 2
= (1 + 3) * 2
1 *. 3 + 2
= 1 * (3 + 2)
1 *. 2 +. 2
= (1 * 2) + 2
2 *: 2 + 3 .* 4
= 2 * ((2 + 3) * 4)
ho cann't spiegare tutti i dettagli di questa notazione, che costa quasi 5 pagine nel libro di Rosser. Ma in generale (e breve), un punto .
prima o dopo un operatore rappresenta un "separatore", per spingere via i due lati. A due punti :
è un separatore più forte, tre punti .:
o :.
è ancora più forte, ma meno di ::
e così via.
Mi chiedo come possiamo scrivere una grammatica per la lingua sopra e quindi analizzarla? Anche se questa notazione è stata obsoleta, ho trovato che appare molto chiara all'occhio del programmatore. Quindi quali sono i suoi pro e contro?
Si può dire '(2 *) $ 3 + 4' in Haskell - ma in effetti, questo introduce i paren come parte della funzione slice. –
@larsmans Lo so, questo è esattamente quello che ho detto "non così potente come i punti". –