giovedì 7 luglio 2011

Java - Sintassi alternative Lambda


· INVIATO DA: Martijn Verburg

La discussione sul lambda-dev mailing list ha cominciato ad affrontare il problema di ciò che la sintassi del linguaggio Java per le espressioni lambda / letterali funzione dovrebbe assomigliare.Diamo un'occhiata ad un po 'non banale esempio e cercare di prendere in giro i problemi fuori.

Il popolo Perl ha un ottimo esempio di qualcosa che utilizza riferimenti funzione in un modo un po 'funzionale - lo chiamano il Transform Schwartz (ma credo sia originariamente un trucco Lisp volte chiamato decorare-sort-undecorate ). Come ci sono solo per noi polli JVM qui, l'ho riscritto in Clojure (in realtà è uno dei miei esempi nel capitolo 9 del libro).

Ecco un frammento di codice Clojure che definisce una funzione per eseguire la trasformata di Schwartz. In sostanza, fornisce un modo molto semplice di ordinare una lista basata su una funzione ausiliaria (chiamata "funzione digitando") forniti dal chiamante.

(Defn schwarz [xf]

(Map # (ennesima% 1 0)

(Sort-da # (ennesima% 1 1)

(Map # (lasciate [w 1%]

(Elenco w (fw))) x))))

Il codice è fare tre fasi distinte - la creazione di un elenco composto da coppie (i valori originali coppia con il valore ottenuto applicando la funzione di codifica per i valori originali), allora l'ordinamento le coppie in base ai valori della funzione di codifica. Finalmente un nuovo elenco viene costruito prendendo solo il valore originale di ciascuna coppia nella ordinati list-of-coppie (e scartando i valori della funzione keying).

Ciò che potrebbe apparire come questo nei vari proposto varianti della sintassi Java? Diamo un rapido sguardo a ciascuno di essi (si noti che perché il sistema di tipo Java è molto più statica, molte delle nostre dichiarazioni di tipo sono più che un po 'prolissa):

/ / Strawman, con parentesi tonde per singola espressione lambda

Lista pubblico

{

ritorno mappa (# (T w) (makelist (w, f.apply (w))), x)

. Sort (# (coppia

. Map (# (coppia

}

/ / Strawman, con bretelle per tutti lambda

Lista pubblico

{

ritorno mappa (# (T w) {makelist (w, f.apply (w))}, x)

. Sort (# (coppia

. Map (# (coppia

}

/ / BGGA

Lista pubblico

{

ritorno mappa ({T w -> makelist (w, f.apply (w))}, x)

. Sort ({Coppia

. Map ({Coppia

}

/ / SotL

Lista pubblico

{

ritorno mappa (# {T w -> makelist (w, f.apply (w))}, x)

. Sort (# {Coppia

. Map (# {Coppia

}

/ / Redmond Lista pubblico

{

ritorno mappa ((T w) -> {makelist (w, f.apply (w))}, x)

. Sort ((coppia

. Map ((coppia

}

Come valutare loro? I miei criteri sono:

1. Deve iniziare con un segno visibile di identificazione, in modo che lambda distinguersi dal codice circostante. Il # è un personaggio comodo per questo.

2. Ha bisogno di utilizzare la sintassi {} delimitazione. Le chiusure sono una sorta di blocco, quindi dovrebbero essere a blocchi, come nel codice.

3. Deve essere tutto d'un pezzo, così la sintassi ha una consistenza visiva e la lambda appare come una singola unità.

4. Preferibilmente, deve avere una forma specializzata breve per letterali funzione di parametri che non tengono (nullary lambda).

Sulla base di questi criteri, Redmond è la scelta peggiore per me - e la mia esperienza di scrittura alla Scala per il libro lo conferma - ho trovato Scala letterali funzione molto più difficile da usare senza problemi di quelli in altre lingue. BGGA è un po 'meglio, ma non mi piace la mancanza di un semplice marchio di identificazione che mi dice "Ciao, io sono un lambda".

Questo porta a una scelta tra il SotL e Strawman con sempre-brace. La scelta di questi due è un po 'arbitrario. Strawman-sempre-brace sembra, ai miei occhi come una vera e propria dichiarazione di metodo Java, ma con il "nome magico" # - mentre SotL è veramente nuova sintassi, ma si sente più vicino alla Redmond e stili BGGA - così potrebbe essere un compromesso accettabile per gli sviluppatori che stanno bene con quelle forme.

La cui combinazione, le mie scelte preferiti sono:

1. SotL

2. Strawman-sempre-brace

3. BGGA

4. Strawman-single-espressione-rotonda

5. Redmond

Originariamente inviato da Java7developer.com . Si prega di utilizzare i commenti per dirci cosa fare di questo problema! Naturalmente, questo non sarà in Java 7 - ma non è troppo presto per cominciare a pensare Java 8 e il futuro :-).

Cheers,

Corso Java - Corsi Java - Corsi programmazione Java

Corso programmazione Android - Certificazione Android


Nessun commento:

Posta un commento

Nota. Solo i membri di questo blog possono postare un commento.