Gambas-it

Gambas3 => Programmazione => Topic aperto da: filipsnew - 03 Aprile 2015, 04:50:20

Titolo: [RISOLTO] AND condizionale che valuta secondo operando solo se necessario
Inserito da: filipsnew - 03 Aprile 2015, 04:50:20
esiste di suo questa operazione?
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: vuott - 03 Aprile 2015, 09:43:57
...non mi risulta  :-\ l'esistenza in Gambas di un operatore simile al AndAlso del VB.
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: Top Fuel - 03 Aprile 2015, 14:23:46
Una cosa del genere non è logica booleana vera e propria. Una operazione And richiede sempre un confronto a due.
Non mi viene nessuna maniera di simularla a dire il vero.
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: vuott - 03 Aprile 2015, 15:34:57
Sull'argomento segnalerei queste pagine:

http://stackoverflow.com/questions/302047/what-is-the-difference-between-and-and-andalso-in-vb-net

http://stackoverflow.com/questions/8409467/orelse-and-or-and-andalso-and-and-when-to-use

http://en.wikipedia.org/wiki/Short-circuit_evaluation
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: Top Fuel - 03 Aprile 2015, 18:17:38
Il funzionamento l'ho capito, ma mi viene difficile pensare ad una maniera per farlo in Gambas. :-\
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: Gianluigi - 03 Aprile 2015, 19:33:48
Il funzionamento l'ho capito, ma mi viene difficile pensare ad una maniera per farlo in Gambas. :-\

Scusa l'ignoranza ma...
Codice: gambas [Seleziona]
If mystring IsNot Nothing And mystring.Contains("Foo") Then 
  ' bla bla
End If
'Questo genera un 'eccezione se mystring = Nothing

If mystring IsNot Nothing AndAlso mystring.Contains("Foo") Then
  ' bla bla
End If
'Questo no

'Ma se tu fai:

If mystring IsNot Nothing Then
  If mystring.Contains("Foo") Then
    'bla bla
  Endif
End If


non ottieni lo stesso risultato?
 :ciao:
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: vuott - 04 Aprile 2015, 02:21:39
non ottieni lo stesso risultato?

Sostanzialmente sì.


Potremmo divertirci anche con il C ;D creando un'apposita libreria esterna dinamica: nella cartella Dati del progetto scriveremo questo file sorgente di C, che chiameremo, ad esempio, andalso.c:
Codice: c [Seleziona]
float AndAlso(int num, int denom) {

   float rit = 0.0;

   if (denom != 0 && num/denom) {   // evita che il calcolo num/denom generi un errore di divisione per zero
       rit = (float) num/denom;
       return rit;
   }

   return -1;

}


Il codice principale di Gambas sarà:
Codice: gambas [Seleziona]
Private Extern AndAlso(n As Integer, c As Integer) As Single In "/tmp/andalso"


Public Sub Main()

  Dim rit As Single

   Creaso()
   
    rit = AndAlso(100, 40)
    If rit = -1 Then Error.Raise("Errore: eccezione in virgola mobile !")
   
    Print rit

End


Private Procedure Creaso()
 
    Shell "gcc -o /tmp/andalso.so " &/ Application.Path &/ "andalso.c -shared -fPIC" Wait
 
End
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: filipsnew - 04 Aprile 2015, 11:40:41
ciao e grazie. Non capisco.. avevo cancellato immediatamente questo post, perché subito dopo avevo trovato alcune risposte sull'argomento. Ma forse è meglio che si sia mantenuto, perché la risposta è che esiste in Gambas la valutazione di corto circuito per OR e AND, con il vincolo (limite che in .NET non sussiste) che non possono essere mescolati (= solo sequenze di OR oppure solo sequenze di AND) e la sequenza deve stare su un'unica riga.

P.es.:

Codice: [Seleziona]
 
  Dim c As integer

  i = 2324
          
  If i = 2324 Or If c = 1 / 0 Then
    
     Stop
    
  Else
    
     Stop
        
  Endif

non solleva alcuna eccezione. Questo è più elegante e leggibile (almeno per me) di quanto risulti annidare comandi If (cosa che inzialmente avevo ovviamente fatto, e che comunque per l'OR non avrebbe senso).

@vuott: non ho capito quello che hai fatto.. hai creato una libreria in C poi l'hai eseguita tramite creasol, ma a cosa serve? usi il cortocircuito di C per valutare una divisione o sollevare eccezione di divisione per zero.. ???
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: Gianluigi - 04 Aprile 2015, 12:14:47
Per rimanere nell'esempio fatto inizialmente sarebbe più corretto così:

Codice: gambas [Seleziona]
Dim c, i As Integer
   c = 10
  
  If c = 11 And If i = 1 \ 0 Then
    
  Endif

 :ciao:

P.S. A me questo pare proprio un And Destro ne più ne meno di quello di VB.Net.
Infatti anche AndAlso valuterà la seconda voce se la prima è corretta  :-\
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: vuott - 04 Aprile 2015, 14:22:30

@vuott: non ho capito quello che hai fatto.. hai creato una libreria in C....
Sì, solo un esempio con il C.   :-\

La soluzione del C evita il blocco causato dall'eccezione (cosa che faccio rilevare da Gambas solo successivamente). Infatti il C in quel caso salta semplicemente l'intera istruzione condizionale.
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: filipsnew - 04 Aprile 2015, 14:30:46
@vuott, ah ecco! avevo capito male credendo che volessi con la libreria ottenere un equivalente AndAlso in Gambas per valutare in generale espressioni booleane e non vedevo come.. era allora solo un esempio particolare di divisione tra interi col cortocircuito &&
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: filipsnew - 04 Aprile 2015, 14:46:21
Per rimanere nell'esempio fatto inizialmente sarebbe più corretto così:

Codice: gambas [Seleziona]
Dim c, i As Integer
   c = 10
  
  If c = 11 And If i = 1 \ 0 Then
    
  Endif

 :ciao:

P.S. A me questo pare proprio un And Destro ne più ne meno di quello di VB.Net.
Infatti anche AndAlso valuterà la seconda voce se la prima è corretta  :-\

Infatti è esattamente lo stesso che AndAlso con valutazione di cortocircuito. Però la dichiarazione multipla di variabili che hai fatto non so se sia corretta come in .NET.. infatti quando io ho provato qualche giorno fa mi segnava sempre errore e p.es. 10 integer li dovrei impilare con dichiarazioni dedicate. Un'altra "pecca" che ho rilevato, rispetto a VB.NET, è l'impossibiltà di dichiarare in posizione arbitraria nel corpo di routine. Cmq, fortunatamente questo interprete VB mi sta aiutando enormemente a trasferire alcune cosette su Linux :) .. è molto intuitivo anche se l'intellisense è abbastanza inferiore a quello di casa Microsoft.. comunque sia, complimenti a Minisini!
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: Gianluigi - 04 Aprile 2015, 15:07:16
Però la dichiarazione multipla di variabili che hai fatto non so se sia corretta come in .NET.. infatti quando io ho provato qualche giorno fa mi segnava sempre errore e p.es. 10 integer li dovrei impilare con dichiarazioni dedicate.

Scusa ma non ho capito in Gambas è lecito dichiarare così:
Codice: gambas [Seleziona]
Dim c, i As Integer, s As String, b As Byte


 :ciao:

P.S. Ah forse ho capito, ti stai mica confondendo con le dichiarazioni a livello di modulo? In effetti li le devi impilare.
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: Gianluigi - 04 Aprile 2015, 15:29:28
in Gambas la valutazione di corto circuito per OR e AND, con il vincolo (limite che in .NET non sussiste) che non possono essere mescolati (= solo sequenze di OR oppure solo sequenze di AND) e la sequenza deve stare su un'unica riga.
...

Scusa ma anche qui non mi è chiaro cosa intendi dire.
Ma in Gambas puoi mischiare AND e OR non puoi mischiare And If e Or If ma quasi mi pare un bene anzi guarda questo codice il primo è ingannevole uno potrebbe pensare che passi a Or e invece come è giusto che sia esce avendo un And If alla sua destra.
Codice: gambas [Seleziona]
Dim c, i As Integer
   c = 10
   i = 10
  If c = 11 And If i = 1 \ 0 Or c = 10 And i = 10 Then
    Print "Niente"
  Endif

  If c = 11 And i = 100 Or c = 10 And i = 10 Then
    Print "Seconda valutazione (dopo OR)"
  Endif

 :ciao:
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: filipsnew - 05 Aprile 2015, 07:04:58
in Gambas la valutazione di corto circuito per OR e AND, con il vincolo (limite che in .NET non sussiste) che non possono essere mescolati (= solo sequenze di OR oppure solo sequenze di AND) e la sequenza deve stare su un'unica riga.
...

Scusa ma anche qui non mi è chiaro cosa intendi dire.
Ma in Gambas puoi mischiare AND e OR non puoi mischiare And If e Or If ma quasi mi pare un bene anzi guarda questo codice il primo è ingannevole uno potrebbe pensare che passi a Or e invece come è giusto che sia esce avendo un And If alla sua destra.
Codice: gambas [Seleziona]
Dim c, i As Integer
   c = 10
   i = 10
  If c = 11 And If i = 1 \ 0 Or c = 10 And i = 10 Then
    Print "Niente"
  Endif

  If c = 11 And i = 100 Or c = 10 And i = 10 Then
    Print "Seconda valutazione (dopo OR)"
  Endif

 :ciao:

Dunque, considerando la prima espressione booleana da testare c'è da dire che 1) l'operatore terminale è OR per cui l'interprete dovrà eseguire le due sottoespressioni (verosimilmente partendo da sinistra) ossia gli operandi dell'OR 2) essendo un OR tradizionale, la valutazione *deve* essere effettuata su ambedue e 3) la logica di cortocircuito dell'And If agirà soltanto sulla prima delle due (fermandosi alla valutazione di c = 11 in FALSE) 4) quando verrà poi valutata la seconda  (TRUE) si rientrerà all'OR terminale per la valutazione finale: FALSE OR TRUE = TRUE. (Praticamente in VB.NET io uso solo AndAlso e OrElse.)
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: filipsnew - 05 Aprile 2015, 07:22:41

P.S. Ah forse ho capito, ti stai mica confondendo con le dichiarazioni a livello di modulo? In effetti li le devi impilare.

Hai ragione! avevo allargato il discorso anche al resto: internamente è infatti lecito abbreviare
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: Gianluigi - 05 Aprile 2015, 10:30:53
And If non può essere mischiato a Or If per il semplice motivo che And If valuta da sinistra verso destra , mentre Or If fa esattamente l'opposto (destra → sinistra).
E' tutto qui il discorso: Gambas come incontra And If se è a False esce ed è morta li.
Ripeto per me è logico che sia così, mi sembra molto comprensibile o almeno al mio cervellino sembra molto comprensibile. :)
 :ciao:
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: Gianluigi - 05 Aprile 2015, 13:59:46
@filipsnew
Oscar Wilde sostiene che dare consigli è sciocco e darli buoni è fatale... :) tant'è mi corre comunque l'obbligo di sconsigliarti un approccio a Gambas3 prevalentemente sulla base delle tue conoscenze di .Net.
Gambas è si un Basic visuale ma non è Visual Basic e soprattutto gira su Linux il che non è da sottovalutare.
 :ciao:
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: Top Fuel - 05 Aprile 2015, 17:46:09
Io dicevo che non mi veniva in mente nessuna maniera di emularlo usando gli operatori booleani.
Ovviamente si può emularlo in maniera differente.
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: Gianluigi - 05 Aprile 2015, 19:50:42
Io dicevo che non mi veniva in mente nessuna maniera di emularlo usando gli operatori booleani.
Ovviamente si può emularlo in maniera differente.

Ehi socio ti sei perso una parte del discorso :D
Vediamo di ricapitolare:
filipsnew non avendo visto subito And If aveva chiesto se in Gambas cera l'emulo di AndAlso e noi dando per scontata l'infallibilità di vuott che aveva detto non esserci questo in Gambas o per meglio dire che non gli risultava, abbiamo detto le nostre … anche se devo dire che la mia non era troppo … ;D
Poi anche se non mi crederai appena spento il computer mi sono ricordato che anche Gambas... ma ormai ero fuori tempo massimo.
Quindi è bene ribadire che AndAlso in VB.Net fa la stessa identica cosa che fa And If in Gambas e cioè se il booleano è a False non prosegue a valutare gli altri And essendo inutile (cortocircuitazione), come del resto fa ma al contrario Or If che non prosegue se il booleano è a True.
Filipsnew aveva persino tentato di cancellare il post appena trovato ciò che cercava senza riuscirci, cosa successa anche a me in altra circostanza e anche se off topic non sarebbe male se qualcuno ci dicesse come fare. ;D
 :ciao:
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: vuott - 05 Aprile 2015, 21:00:04
.... noi dando per scontata l'infallibilità di vuott che aveva detto non esserci questo in Gambas o per meglio dire che non gli risultava...

1) Mai fidarsi ciecamente di quello che scrivo.

2) Rileggendo tutta questa discussione posso affermare con tranquillità che in Gambas - attualmente - non esiste un operatore come l'AndAlso del VB.NET .
Io avevo scritto che:
...non mi risulta  :-\ l'esistenza in Gambas di un operatore simile al AndAlso del VB.
Infatti, mentre in quel linguaggio esso è un operatore unico ed individuale, la tua proposta And If - al di là dei suoi effetti - è composta da un operatore booleano e da una parola chiave; pertanto non è un unico operatore.
...mi ricorda un po' la questione sulle stringhe a lunghezza fissa presenti in VB ed emulabili in Gambas:   (http://levipere.com/wp-content/plugins/locco-emoticons/Locco/Locco_Ro_smiley_44.gif)
http://www.gambas-it.org/smf/index.php?topic=3919.0
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: Gianluigi - 05 Aprile 2015, 21:16:42
Si ora che lo fai notare devo proprio ammettere che sebbene la parola AndAlso sia composta da più parole manca dello spazio e pertanto occorre convenire che semanticamente (?) il ragionamento di vuott non fa una piega.
Pertanto possiamo tranquillamente affermare senza ombra di dubbio che No in Gambas non esiste un operatore unico, individuale e indivisibile come appunto è AndAlso per VB.
Ne consegue che vuott era e rimane infallibile.

Circa il fatto che Gambas abbia o meno le stringhe a lunghezza fissa, parafrasando il famoso lettore dell'Unità che rispose al figlio che effettivamente i coccodrilli volicchiano, si può affermare sia stato provato che alcune stringhe di Gambas fissicchiano.
 :)
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: vuott - 05 Aprile 2015, 21:25:28
Ne consegue che vuott era e rimane infallibile.
No, l'infallibilità non mi appartiene, poiché l'infallibilità è propria di San Midi (http://it.wikipedia.org/wiki/Musical_Instrument_Digital_Interface).
Io ho solo detto che non mi pareva esitesse un esplicito operatore corrispondente al AndAlso del VB. Questo non toglie, ovviamente, che si possano ottenere in Gambas identici risultati usando altre risorse.   (http://levipere.com/wp-content/plugins/locco-emoticons/Locco/Locco_Ro_smiley_34.gif)


.... alcune stringhe di Gambas fissicchiano.
Esattamente: sono state trovate alcune soluzioni.

Del resto, come sappiamo, molte operazioni che non sono svolte in Gambas attraverso un'esplicita ed unica risorsa, sono effettuabili usando altre risorse e strategie.


Inoltre, se c'è interesse di qualcuno, questo potrebbe addirittura proporre a Minisini di implementare quell'operatore AndAlso !
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: Gianluigi - 05 Aprile 2015, 22:50:22

No, l'infallibilità non mi appartiene, poiché l'infallibilità è propria di San Midi (http://it.wikipedia.org/wiki/Musical_Instrument_Digital_Interface).
...

E' chiaro che infallibile è un'iperbole ma che ci fidiamo di ciò che scrivi su Gambas è altrettanto evidente :)

Anche se in ritardo Buona Pasqua e Buona Pasquetta naturalmente estesa a tutta la lista
 :ciao:
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: filipsnew - 08 Aprile 2015, 08:07:30
eheh.. quante risposte a un messaggio che avrebbe dovuto non esserci :-)
Vorrei solo fare un po' di chiarezza, visto che sono nuovo a questo ambiente. Allora, Gianluigi affermi che risulta logico che si comporti in questo modo, ovvero è ovvio il divieto di mix di operatori AND IF / OR IF con altri (anche booleani in senso stretto) OR IF / AND IF rispettivamente. Certo, alla luce di questa logica di funzionamento, per forza deve essere così: AND IF valuta, al di là di come possa essere stutturata l'espressione complessiva, da sinistra, e se è FALSE esce; OR IF valuta da sinistra (o da destra?) e se è TRUE (a sinistra o a destra?) esce. Ma dove sta scritto questo comportamento? Io avevo trovato un paio di discussioni (che adesso non riesco più a reperire), che illustravano solo quanto avevo riportato, ma rispetto alla documentazione ufficiale niente, per cui, dove si può leggere l'informazione relativa? E qui vorrei riallacciarmi a quanto espresso da vuott, e cioè che non si tratta di un operatore ma di una composizione di un operatore e di una parola chiave. A parte il fatto, credo ???, che anche se al posto di AND IF ci fosse in Gambas un unico operatore, magari denominato ANDALSO, si potrebbe ottenere qualcosa di identico a AND IF (credo, in base a quanto detto, che in entrambi i casi l'interpretazione dovrebbe essere qualcosa di elementare: se si incontra questa stringa valutare a sinistra e se è F (o V) uscire); sicuramente ci sarà un altro significato sottostante (questo fatto è comunque garantito dalla diversità dei comportamenti possibili ottentibili in Gambas e in .NET), e sarà quello indicato da Gianluigi, cioè una diversa logica di implementazione ANDALSO vs AND IF, ORELSE vs OR IF, anche se in un sottoinsieme di casi (quelli ammissibili in Gambas) si realizzano risultati equivalenti.

Non è ammissibile, p.es.:
Codice: [Seleziona]
If a And If b Or[Or If] c Then                            

EndIf
(1)

Il fatto che si precluda dal punto di vista sintattico un equivalente dell'istruzione .NET

Codice: [Seleziona]
If a Andalso b Or[Orelse] c then

End If
(2)

a mio avviso vuol dire che lo sviluppatore ha voluto evitare situazioni del tipo (1) in cui l'utente di Gambas sperasse di ottenere risultati del tipo (2), impossibili vista la logica richiamata da Gianluigi (in effetti chi vieterebbe di scrivere un'espressione di test del tipo (1) se la sintassi lo consentisse?). Tutto sommato, un operatore emulo di AndAlso e uno di OrElse non sarebbero male, avere la libertà di espressioni miste sarebbe certamente meglio, ma forse la cosa risultava un po' più dispendiosa in termini di realizzazione, e Misinini non aveva molto tempo a disposizione.. ;-)
Titolo: Re: AND condizionale che valuta secondo operando solo se necessario
Inserito da: Gianluigi - 08 Aprile 2015, 18:20:27
Hai ragione mi ricordavo male:
“Short-circuit path:
When you use several test expressions splitted by OR IF keywords, then they are evaluated from left to right until the first TRUE one is found, and then the test is TRUE. If all expressions are FALSE, then the test is FALSE.”

e quindi ho fatto un ragionamento errato chiedo venia

 :ciao: