Come si chiama il confronto "X = $ pippo = Y"?

2

Durante la scrittura di un'istruzione Perl come if ( $foo >= X && $foo <= Y ) ancora una volta, mi sono chiesto perché molti linguaggi di programmazione non supportano la forma più comoda if ( X <= $foo <= Y ) e ciò che viene chiamato. Ho trovato "confronto a 3 gambe" ma non ho trovato risultati durante la ricerca. Tra l'altro, c'è anche la forma "elemento di set" if ( $foo in X..Y ) che considero più leggibile se fornita tramite una breve parola chiave.

Esiste un termine per il confronto X <= $foo <= Y ? Quali lingue lo supportano?

    
posta Jakob 27.08.2012 - 07:13
fonte

5 risposte

7

Lo definirei un confronto n-ario .

Gli operatori che lavorano su numeri arbitrari di operandi sono chiamati "n-ary" operatori :

n-ary

From a mathematical point of view, a function of n arguments can always be considered as a function of one single argument which is an element of some product space. However, it may be convenient for notation to consider n-ary functions, ...

The same is true for programming languages, where functions taking several arguments could always be defined as functions taking a single argument of some composite type such as a tuple, or in languages with higher-order functions, by currying.

  • Binary means 2-ary.
  • ...
  • n-ary means n operands (or parameters), but is often used as a synonym of "polyadic".

Python ha un operatore n-ary < . La sezione 5.6 dei documenti di lingua dice:

Unlike C, all comparison operations in Python have the same priority, which is lower than that of any arithmetic, shifting or bitwise operation. Also unlike C, expressions like a < b < c have the interpretation that is conventional in mathematics:

Formally, if a, b, c, ..., y, z are expressions and op1, op2, ..., opN are comparison operators, then a op1 b op2 c ... y opN z is equivalent to a op1 b and b op2 c and ... y opN z, except that each expression is evaluated at most once.

    
risposta data 27.08.2012 - 08:17
fonte
10

SQL ha un controllo limiti / intervallo nativo:

SELECT * FROM foo WHERE foo.bar BETWEEN 1 AND 100

Controllare se un valore rientra in un determinato intervallo ha senso in SQL a causa della natura algebrica dei database relazionali.

Però, quando si parla di linguaggi di programmazione, c'è un ordine delle operazioni e ( X <= $foo <= Y ) verrebbe normalmente interpretato come ( ( X <= $foo ) <= Y ) ) , che è molto diverso da ( $foo >= X && $foo <= Y ) . Per ottenere un dolce e amp; operatore di controllo di intervallo semplice dovremmo dire al parser di ignorare l'ordine delle operazioni per questo caso molto specifico, e questo andrebbe contro il principio di minimo stupore .

Non vale la pena e la potenziale confusione per qualcosa che ha un vantaggio estremamente piccolo, solo zucchero sintattico in realtà. Se ti ritrovi a fare controlli di intervallo molto spesso e non ti interessa digitare alcuni caratteri in più, puoi sempre scrivere una breve funzione per prenderti cura dei paragoni per te.

    
risposta data 27.08.2012 - 07:57
fonte
2

La maggior parte delle lingue PLC include un tipo di istruzione che fa questo. In RSLogix si chiama istruzione LIM ( vedi pg 3- 5 ). Richiede 3 input: un valore Low Lim , Test e High Lim e restituisce un output vero / falso.

Tieni presente che puoi fornire parametri in cui Low Lim è superiore a High Lim , quindi passa a una condizione OR. Ovvero, l'output è true se l'input è superiore a Low Lim OR inferiore a High Lim . Questo ha senso se si considera che molte volte si potrebbe avere un encoder a 12 o 16 bit su un asse rotante, quindi il valore zero è adiacente al valore più alto possibile.

Inoltre, altre lingue, ad es. TwinCAT, ha un'istruzione LIMIT che emette un valore coatto invece di un booleano. Cioè, il suo scopo è quello di darti un risultato entro i limiti specificati, o uno dei limiti stessi se l'input è al di fuori dei limiti specificati. Credo che questa funzione sia simile alla funzione di saturazione in Matlab / Simulink .

In entrambi i casi potresti semplicemente creare la tua funzione per farlo dalle primitive disponibili, quindi posso capire perché includere un simile operatore potrebbe essere considerato superfluo.

    
risposta data 27.08.2012 - 22:05
fonte
1

In lingue come C, a < b < c è compilato come

  (a<b) < c  
  a<b evaluates to 0 or 1, so you end up executing 
  (1 < c) or (0 < c)

che non è quasi certamente quello che vuoi.

Nelle lingue con meno danni cerebrali di C, puoi essere salvato da digita system, perché (a < b) restituisce true o false, e (false < c) non è un'espressione valida.

Non riesco a pensare in anticipo a nessuno dei linguaggi che implementano questo operatore ternario il modo in cui ti aspetti, ma sarebbe pericoloso utilizzarlo se esiste, se non altro perché così tante altre lingue ti rovineranno.

    
risposta data 27.08.2012 - 21:40
fonte
1

In inglese si chiama "tra inclusive".

T-SQL di Microsoft offre una sintassi speciale per esso

select * from User where Age between 18 and 25
    
risposta data 28.08.2012 - 01:50
fonte

Leggi altre domande sui tag