Avvolgendo la mia mente attorno alla notazione del prefisso?


10

Sto leggendo di LISP.

Capisco come funziona la notazione con prefisso ad un certo livello, ma mi chiedevo se ci fossero dei trucchi per renderla intuitiva.


6
A parte la pratica, intendi?

L'utente RPL è di gran lunga il mio sapore preferito di LISP. Non ha nemmeno parentesi! en.wikipedia.org/wiki/RPL_(programming_language) Mi manca usare il mio HP 50g :-(
Robbie

All'inizio sembrava non intuitivo, ma ora penso che sia meraviglioso, e per lo più ho finito di leggere. In realtà è come parliamo: "La somma di ..., il prodotto di ..." Tuttavia, richiede un diverso tipo di lettura. Ora applichi semplicemente l'operatore a tutti gli argomenti, invece di leggerli in una riga.
Marco C

Cosa c'è di sbagliato nella notazione del prefisso? Quasi tutte le lingue lo usano. Le chiamate di funzione sono quasi sempre prefissi.
SK-logic,

Non proprio; "intuitivo" è intuitivo perché l'hai imparato in una forma di convenzioni matematiche per> 20+ anni. Dal momento che solo LISP e forse poche altre lingue usano questa convenzione e ne imparerai ancora molto di più, difficilmente diventerà altrettanto "intuitivo". E stiamo parlando solo di espressioni semplici qui (2 + 3 ... come ti piacerebbe provare un liner "mezza pagina"? :)
Rook

Risposte:


6

Leggere mentalmente da sinistra a destra come lingua parlata con i verbi appropriati può aiutare. Ad esempio (+ 3 2) potrebbe essere "aggiungi tre e due". Nel caso più generale, puoi dire "esegui $ operazione su $ operandi". Applicato allo stesso caso: "Esegui l'operazione di aggiunta su tre e due".


Cosa faresti con ( = 1 2 )e( > 4 2 )
Vivian River il

3
Useresti domande retoriche. :) Uguale? (Cosa?), "1 e 2! (Erm ... No ...)
Arafangion

@RiceFlour (Ehi, sono cresciuto mangiando cose fatte con farina di riso - ho un problema con il glutine.) Avrei letto "È uno uguale a due?" O "Sono uguali?" Gli operatori maggiore di e minore di non sono così naturali in forma di prefisso, ma mi chiedo quanto spesso vengano utilizzati nel codice Lisp.
Marco C

7

Trucchi? Per che cosa?

Non ti sembra ancora intuitivo perché il tuo parser mentale non è abituato. Andrà meglio se lo usi e lo rileggi ancora e ancora.


Non ho nemmeno letto che gran parte di essa, ma ora penso che sia meraviglioso. Sembra che il mio cervello stia cominciando ad avere un senso quasi "tattile" delle parentesi. Penso che la sensazione diventerà solo più acuta.
Marco C

5

Potresti pensarlo come una sorta di chiamata di funzione:

(operator operand1 operand2 ...)

Non c'è niente di molto speciale al riguardo. Se sovraccarichi gli operatori in C ++ (e in molti altri linguaggi che lo consentono) spesso devi definire questo tipo di funzione esattamente in questo modo:

MyClass operator+(MyClass const& x, MyClass const& y);

Sì, è così che lo faccio. Se fai un passo indietro e guardi le chiamate di metodo in Java, C #, ecc., In realtà sono solo notazioni di prefisso con le parentesi in un posto leggermente diverso: MyMethod (arg1, arg2).
nlawalker,

4

Molte lingue usano un mix di prefisso, infisso e persino postfisso.

Lisp usa solo il prefisso - per impostazione predefinita. Se sin (x) è intuitivo dalla matematica, allora (sin x) non è lontano. Se move (cane, casa) è una procedura tradizionale, allora in Lisp lo è (sposta cane a casa).

Lisp non fa alcuna eccezione per la matematica e gli ossequi +, -, * e altri come le normali chiamate di funzione.


2

Quando (alla fine) "Tutto è una chiamata di funzione" (o un modulo speciale, o una macro-espansione, entrambi con la sintassi superficiale di "chiamata di funzione"), è sembrato abbastanza naturale.

Quindi, poiché (= 1 2)ho letto che "chiama il confronto numerico equivale a 1 e 2".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.