Gli operatori sono solo metodi "speciali"? [chiuso]

5

Ecco cosa si intende per operatori e metodi .

Tentativo di mantenere le domande il più semplici e aperte possibile, dal momento che la domanda riguarda più la natura concettuale degli operatori e dei metodi NON come una lingua ha deciso di implementarle.

Prova del concetto: questo esempio in Ruby è più una prova di concetto che altro. ESEMPIO: in Ruby, " 1+2 " equivale a " 1.+(2) ", il che significa che l'oggetto "1" implementa un metodo chiamato "+" con l'oggetto "2" come argomento del metodo.

    
posta blunders 05.10.2011 - 17:12
fonte

7 risposte

7

Alcune lingue (mi viene in mente SML di NJ ) consentono di dichiarare le funzioni come "infix". In questo caso una "funzione" e un "operatore" sono praticamente identici, differendo solo nella notazione. Non riesco né a richiamare né a risalire alla fonte, ma ho letto un saggio che sostiene che la Combinatory Logic ha, come sue radici (filosofiche), il desiderio di fare degli "operatori" il fondamento della matematica.

Penso che probabilmente otterrai molti argomenti negativi sia a favore che contro l'idea che gli operatori siano identici alle funzioni. Gli argomenti si sentiranno simili alle argomentazioni su "che cos'è un oggetto?", Eccetto che matematicamente, "funzione" e "operatore" sono realmente identici, mentre "oggetto" non ha una buona base matematica.

    
risposta data 05.10.2011 - 17:31
fonte
5

Gli operatori non sono sempre identici alle funzioni, dal momento che la loro semantica potrebbe essere significativamente diversa da una semantica di una semplice funzione chiamata. Ad esempio, l'operatore sizeof(...) in C non valuta il suo argomento. L'operatore ternario ( x?y:z ) valuta sempre solo due dei suoi argomenti. Gli operatori logici ( && , || ) potrebbero non valutare il secondo argomento.

E anche i normali operatori aritmetici potrebbero avere un complicato comportamento implicito nella trasmissione dei tipi.

Per questo motivo, non è possibile definire gli operatori come funzioni, almeno in un linguaggio desideroso. I linguaggi pigri sono diversi, ma comunque, non sarà possibile definire qualcosa come sizeof(...) come una funzione.

    
risposta data 05.10.2011 - 18:02
fonte
4

Almeno in Haskell, un operatore è una funzione di simbolo con un'arità di almeno 2. (Anche se esiste un'estensione che solleva questa restrizione) È possibile definire i propri operatori, sovraccaricarli tramite classi di tipi, dare loro la precedenza e associatività etc ... Dopotutto, mettendo le parentesi attorno a un operatore, puoi usarlo come qualsiasi altra funzione (prefisso). Puoi anche usare una normale funzione come operatore incapsulandola in apici inversi.

Ecco alcuni esempi (stupidi):

(.:) :: (a -> b) -> (c -> d -> a) -> (c -> d -> b)
(.:) = (.) . (.)

(§) = negate .: (*)

-- or similiar

a § b = - (a * b)

infixl 7 *
infixr 9 .:
    
risposta data 05.10.2011 - 17:33
fonte
3

Dipende molto dalla lingua.

La maggior parte delle lingue di funzione di alto livello sono identiche.

Per le lingue interpretate di solito c'è poca differenza (specialmente quando il linguaggio ti permette di scrivere i tuoi operatori (allora è solo zucchero sintattico per una chiamata di metodo), ma poi un linguaggio interpretato tutti gli operatori sono fondamentalmente chiamate di metodo come la lingua è interpretato).

Quando si parla di linguaggi come il C ++, la trama diventa più complessa.

    Gli operatori
  • su tipi primitivi sono non come chiamate di metodi.
  • Gli operatori
  • sui tipi di classe sono proprio questo: chiamate di metodo.

C'è una distinzione importante in quanto ciò può modificare il comportamento atteso intrinseco dell'operatore. Ad esempio il & & e || gli operatori sono operatori di scelta rapida quando vengono utilizzati su tipi primitivi. Ma quando si esegue l'override per una particolare classe, ora sono l'equivalente delle chiamate di metodo e quindi tutti i parametri devono essere valutati prima che venga chiamato il metodo e quindi non sono più operatori di scorciatoia.

Quando usi i metodi (e quindi gli operatori sovraccarichi di classe) hai garanzie specifiche su dove sono i punti di sequenza (quindi alcuni effetti collaterali sono OK). Ma con gli operatori normali di solito non ci sono punti di sequenza fino alla fine dell'espressione (quindi gli effetti collaterali hanno uno scopo molto più ampio per interferire con il resto dell'espressione).

    
risposta data 05.10.2011 - 17:43
fonte
2

Oltre alle altre risposte qui, che coprono molti buoni esempi, eccone un altro.

In C ++, ad esempio, alcuni operatori devono essere definiti al di fuori della definizione di una classe e sono quindi "funzioni libere" con un lato sinistro e un lato destro (2 argomenti).

Quindi in questo caso non sono nemmeno "Metodi", in quanto non sono definiti all'interno di alcuna classe.

    
risposta data 05.10.2011 - 18:10
fonte
1

Almeno negli operatori Scala sono i metodi funzioni . Puoi utilizzare un metodo che accetta come operatore infisso un singolo parametro (vedi A Tour of Scala: Operators e Programmatori Scala per C #, parte 6: operatori infissi

    
risposta data 05.10.2011 - 18:02
fonte
1

Innanzitutto, comprendi che un "metodo" non è altro che una funzione. (Si prega di non confondere il "metodo" con "overloading del metodo", "invio del metodo" ecc. Che sono in effetti delle buone funzionalità linguistiche.)

In secondo luogo, comprendi che un operatore non è altro che una funzione con un nome divertente e un supporto speciale dal parser in modo da poterli scrivere prima, dopo o infisso.

Quindi, è corretto affermare che gli operatori sono "metodi speciali".

    
risposta data 06.10.2011 - 14:18
fonte

Leggi altre domande sui tag