La distributività dell'operatore nelle espressioni - zucchero sintattico

1

Quando si scrivono espressioni booleane, spesso si deve usare qualcosa del tipo:

A == any of B1, ..., Bn
C < all of D1, ..., Dm

Ma nel codice devi usare i moduli espansi:

A == B1 or ... or A == Bn
C < D1 and ... and C < Dm

Questo mi sembra che qualsiasi e tutto siano semplicemente la forma distribuita di o e e . Questo mi ha fatto chiedere se è possibile applicare la distribuzione agli operatori in un modo che i compilatori / interpreti possono comprendere. Per l'esempio sopra, ad esempio, qualcosa di simile:

A == B1 +_or ... +_or Bn
C < D1 +_and ... +_and Dm

Essenzialmente, prendendo gli operatori come relazioni, dovrebbe funzionare in questo modo:

R1(A, distributive_R2(B1, ... , Bn)) becomes
R2(R1(A, B1), ... , R1(A, Bn))

Questo potrebbe valere per più di un semplice booleano:

X / Y1 +_+ ... +_+ Yn becomes
X/Y1 + ... + X/Yn

Naturalmente, il mio prefisso +_ potrebbe non essere la sintassi ideale; Sono sicuro che ce ne sono di migliori là fuori. Tuttavia, questo mi sembra abbastanza utile e comprensibile. Qualche idea?

    
posta Michael Rosefield 17.07.2013 - 12:55
fonte

1 risposta

3

1. Non mi piace la sintassi

A == B1 or ... or A == Bn non è ovvio. È per le forme semplici, ma quelle forme semplici sono rare. Ad esempio, non è necessario scrivere:

A == 1 or ... or A == 10

quando puoi semplicemente scrivere:

A >= 1 and A <= 10

Se si annulla la sequenza, la sintassi non aiuterà nemmeno:

Set = [ 4, 7, 2, 3, 0, 1, 1 ]
A == Set[0] or ... or A == Set[Set.Length]

è troppo prolisso.

Inoltre, che cosa sarebbe:

A == 1 or ... and A == 10

significa? Se questo è illegale, come un IDE potrebbe impedirlo? Perché imporre allo sviluppatore di digitare la stessa parola due volte?

Anche la leggibilità dovrebbe essere la tua preoccupazione. C < D1 +_and ... +_and Dm nella tua domanda è già difficile da capire. Non riesco a immaginare un pezzo di codice che combini diversi intervalli.

2. in e intervalli in SQL e Ada

La sintassi più semplice sarebbe quella già utilizzata in SQL per le parole chiave e in Ada e Matlab per gli intervalli:

A in 1..10

o

A in Set

Alcune varianti SQL utilizzano anche between :

A between 1 and 10

Preferisco in gran parte la sintassi di Ada 1..10 , che è estremamente esplicito e più breve da scrivere. La parola chiave and fa pensare al lettore un'operazione booleana, non un intervallo. Senza conoscere la sintassi, alcuni sviluppatori saranno anche tentati di scrivere:

A between 1, 10

o

A between(1, 10)

La sintassi SQL / Ada è piacevole quando si tratta di cercare un valore in un set o in un intervallo, ma non quando si tratta di verificare che un'espressione sia vera per qualsiasi valore di una sequenza. Non so se quei linguaggi abbiano costrutti che lo consentano.

3. C # world, come nota a margine

Si noti che in C #, che utilizza alcuni paradigmi della programmazione funzionale e ha espressioni lambda, la sintassi suggerita dovrebbe essere scritta in questo modo:

Ricerca di un valore in una sequenza:

var isInList = sequence.Contains(value);

o

var isInList = sequence.Any(a => a == value);

Verifica che l'espressione en sia valida per qualsiasi elemento di una sequenza:

var trueForAll = sequence.All(a => a > 0);

Filtering:

var positiveOnly = sequence.Where(a => a > 0);

Questa non è la migliore sintassi di sempre, e in gran parte preferisco quella ispirata da SQL / Ada, ma ti dà alcune idee su come il tuo problema è risolto in diverse lingue.

Puoi usare questa sintassi per crearne una tua, con parole chiave specifiche per la lingua. Qualcosa come:

A in Set              # Verifies that Set contains A.
B in 1..10            # Verifies that 1 ≤ B ≤ 10.
C > 0 for any Set     # Verifies that all elements of Set are positive.
D <> 0 for any 1..10  # Verifies that none of the values between 1 and 10 are equal to zero.
    
risposta data 17.07.2013 - 13:23
fonte

Leggi altre domande sui tag