Il funzionamento l'ho capito, ma mi viene difficile pensare ad una maniera per farlo in Gambas. :-\
Scusa l'ignoranza ma...
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:
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:
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à:
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
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.:
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.. ???
Per rimanere nell'esempio fatto inizialmente sarebbe più corretto così:
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 :-\
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ì:
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.
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.
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:
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.:
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
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.. ;-)