Infix vs Notazione prefisso - Quale preferisci?

4

Ho imparato Clojure e sto guardando Scheme e CL che mi hanno fatto conoscere la notazione del mondo dei prefissi. All'inizio non mi piaceva ma sta ancora iniziando a crescere su di me. Ad essere onesti, però, ci sono ancora lunghi calcoli che sono difficili da capire per me, ma penso che sia un problema per me che necessiti di più esposizione / pratica e lo prendo.

Ma questo mi porta alla domanda: quale tipo di notazione preferisci e perché?

    
posta Jetti 14.12.2010 - 17:54
fonte

8 risposte

13

Trovo più facile leggere la notazione infix, semplicemente perché ho lavorato con lui fin dall'asilo.

    
risposta data 14.12.2010 - 18:08
fonte
9

Non ho preferenze. Posso lavorare bene in entrambi.

Non molti programmatori si rendono conto che la notazione del prefisso è in realtà la norma e infisso è lo strano. Dopotutto, quasi ogni lingua usa la notazione del prefisso per chiamate di funzioni / metodi. È solo un numero relativamente piccolo di operatori aritmetici e logici che sono infissi.

Quanto più guardi al nostro sistema di simboli matematici, tanto più ci vedrai. Alcuni sono infissi (+, -, *), alcuni sono postfix (x 2 ), alcuni prefissi (tan x), alcuni sotto-fix (rapporti e frazioni) e alcuni overfix. Non è semplice come PEMDAS.

    
risposta data 14.12.2010 - 19:13
fonte
5

Mi piace il prefisso per cose simili a funzioni, infisso per cose simili all'operatore, postfix per cose simili alla proprietà e mixfix per cose come control-flow:

// prefix:
abs(-3)
sin(PI)

// infix:
1 + 2
4 / 5

// postfix:
list size
employee name

// mixfix:
if a then b else c // (where if/then/else is the mixfix function)

Ciò che io non mi piace sono le lingue che non mi permettono di esprimere le cose nel modo più naturale per me. Non mi piace:

// lisp, have to do prefix for everything:
(+ 1 2)
(if a b c)
(size list)

// forth, have to do postfix for everything:
1 2 +
a b c if
1 + 2
4 / 5
    
risposta data 15.12.2010 - 20:25
fonte
3

Prefisso, semplicemente perché la precedenza degli operatori è esplicita.

FYI, i calcoli più lunghi (in realtà, qualsiasi catena di operazioni) in Clojure possono essere scomposti usando le macro -> e ->> . per esempio:.

(-> (get-some-value)
  inc
  (* 2)
  (max 50))

è l'equivalente di:

(max (* (inc (get-some-value)) 2) 50)

Mentre la macro -> antepone i risultati precedenti agli argomenti dell'espressione successiva, ->> li aggiunge. Questo è in genere molto utile se utilizzato con funzioni che prevedono collezioni e seq:

=> (->> "some string we want to capitalize"
     (partition-by #{\space})
     (mapcat #(cons (Character/toUpperCase (first %)) (rest %)))
     (apply str))
"Some String We Want To Capitalize"

Fornire servizi per comporre facilmente operazioni più semplici in compositi come questo è uno dei grandi vantaggi di Clojure. Per ulteriori letture, consulta il post di fogus sulla macro -> , e poi il suo post successivo sull'argomento dei "giustamente" combinatori di mughetti in Clojure .

    
risposta data 14.12.2010 - 18:40
fonte
2

Di questi due prefissi (il suffisso può essere usato allo stesso modo, ma le uniche lingue che conosco usano PS e Forth).

  1. Rimuove la necessità di qualsiasi tipo di precedenza dell'operatore e associatività sinistra / destra. Entrambi, nel senso che non devi pensarci, e nel senso che l'implementazione del linguaggio è leggermente più semplice dal momento che queste forze sono pre-risolte.
  2. Se applicato in modo coerente, il codice risultante è molto vicino a un albero, il che rende l'analisi più semplice o inutile (e ciò consente cose come la manipolazione programmatica di quella struttura ad albero).
risposta data 14.12.2010 - 18:37
fonte
1

Preferisco di gran lunga avere il prefisso quando sto leggendo il codice.

Ma infix quando pensi al codice.

    
risposta data 14.12.2010 - 20:30
fonte
1

Postfix. È chiaramente il più utilizzato nelle lingue procedurali e nelle lingue orientate agli oggetti.

Il codice sequenziale è notazione postfix:

  do x; do y; do z;

Anche il codice OO è postfix:

   a.x.y

La maggior parte dei linguaggi OO e procedurali utilizzava entrambe queste convenzioni pesantemente mescolate con un po 'di infisso e forse un certo prefisso per alleggerire il carico cognitivo e aumentare il riconoscimento del modello.

Anche le lingue funzionali usano comunemente un formato simile a postfix:

   let x = g r in
   let y = f x in
   ..

come modo per rendere la versione del prefisso meno comprensibile:

  let y = f (g r) in

più facile da leggere con la fattorizzazione (si prega di immaginare una catena di applicazioni più brutta:)

    
risposta data 24.11.2011 - 11:05
fonte
1

Dipende,

Gli operatori binari in cui l'ordine è importante (asimmetrico) beneficiano della notazione infisso poiché è più facile distinguere in quale direzione verrà valutato l'operatore, ad es.

x.Operation(y); //so x is doing "Operation" to y

rispetto a

Operation(x,y); //what was the order of arguments again?

operatori simmetrici questo è meno di un problema, e in effetti a volte può essere espanso per essere operatori n-ari con notazione prima o dopo la correzione quando ad esempio associative

sum(1,2,3,4,5);

per pre-fix vs post-fix Preferisco il prefisso come yoda, parli, con post-fix

l'ultimo di tutti è ciò che dijstra ha dovuto dire sull'argomento in sostanza ha preferito infix per le operazioni associative

    
risposta data 24.11.2011 - 12:05
fonte

Leggi altre domande sui tag