overloading

  • Creatore
    Topic
  • #69590
    Up
    0
    Down
    ::


    è possibile gestire l’overloading degli operatori in LaTeX?
    l’ideale sarebbe poter fare qualcosa di questo tipo
    `\newcommand{\insulto}[2]{#1 è #2}
    \newcommand{\insulto}[3]{#1 e #2 sono #3}
    \insulto{luca}{scemo} e \insulto{marco}{francesco}{cretini}`
    ho provato a giocare sui newcommand ma non riesco a concludere molto…

Visualizzazione 9 filoni di risposte
  • Autore
    Risposte
    • #69591
      robitex
      Amministratore del forum
        Up
        0
        Down
        ::

        albertobosia” post=68707è possibile gestire l’overloading degli operatori in LaTeX?
        l’ideale sarebbe poter fare qualcosa di questo tipo
        `\newcommand{\insulto}[2]{#1 è #2}
        \newcommand{\insulto}[3]{#1 e #2 sono #3}
        \insulto{luca}{scemo} e \insulto{marco}{francesco}{cretini}`
        ho provato a giocare sui newcommand ma non riesco a concludere molto…

        Non credo si possa fare:
        Al comando \insulto passi un numero variabile di argomenti (e quindi a rigore non si può parlare di overloading che invece interessa il tipo dell’argomento), quindi non può sapere se questi sono 2 o 3.

        Una diversa sintassi potrebbe risolvere il tuo problema, per esempio prevedendo due distinti comandi per i due casi: \insulto ed \insulti.

        Oppure prevedere una sintassi chiave valore:
        `\insulto{name={Paolo,Luca}, insulti={furbetti}}
        % -> Paolo e Luca sono furbetti

        \insulto{name={Nicola}, insulti={furbetto,pasticcione}}
        % -> Nicola è furbetto e pasticcione`

        Ovvio che senza conoscere il tuo obiettivo, questa esigenza pare non abbia nessuna utilità.
        Un saluto.
        R.

      • #69592
        Up
        0
        Down
        ::

        albertobosia” post=68707è possibile gestire l’overloading degli operatori in LaTeX?
        l’ideale sarebbe poter fare qualcosa di questo tipo
        `\newcommand{\insulto}[2]{#1 è #2}
        \newcommand{\insulto}[3]{#1 e #2 sono #3}
        \insulto{luca}{scemo} e \insulto{marco}{francesco}{cretini}`
        ho provato a giocare sui newcommand ma non riesco a concludere molto…

        È possibile a costo di sostituire le parentesi graffe con parentesi quadre o tonde, ma non lo puoi fare con \newcommand: devi “sporcarti” le mani con le definizioni TeX (il comando \def). Leggiti gli Appunti.

        In questo caso si parlerebbe più di overloading di “funzioni” cioè “comandi”, trattandosi di TeX.


        @robitex
        : l’overloading delle funzioni consente anche di avere il (solo) numero di argomenti diverso. Ma per avere più argomenti dello stesso tipo, non serve scomodare l’overloading (si può fare anche in C).

        Ciao,
        Antonio

      • #69593
        robitex
        Amministratore del forum
          Up
          0
          Down
          ::

          antonio.macrì” post=68713

          è possibile gestire l’overloading degli operatori in LaTeX?
          l’ideale sarebbe poter fare qualcosa di questo tipo
          `\newcommand{\insulto}[2]{#1 è #2}
          \newcommand{\insulto}[3]{#1 e #2 sono #3}
          \insulto{luca}{scemo} e \insulto{marco}{francesco}{cretini}`
          ho provato a giocare sui newcommand ma non riesco a concludere molto…

          È possibile a costo di sostituire le parentesi graffe con parentesi quadre o tonde, ma non lo puoi fare con \newcommand: devi “sporcarti” le mani con le definizioni TeX (il comando \def). Leggiti gli Appunti.

          In questo caso si parlerebbe più di overloading di “funzioni” cioè “comandi”, trattandosi di TeX.


          @robitex
          : l’overloading delle funzioni consente anche di avere il (solo) numero di argomenti diverso. Ma per avere più argomenti dello stesso tipo, non serve scomodare l’overloading (si può fare anche in C).

          Ciao,
          Antonio

          Uhm, continuo ancora ad essere dubbioso sulla possibilità di gestire un numero di argomenti variabili con TeX, per il semplice motivo che la ricerca dei token argomento compiuta da un comando è “fissa” (attendiamo pareri TeXnici). A meno che nel codice del comando a due argomenti non si inserisca un \@gobble o qualcosa del genere.
          Tipo:
          `
          \makeatletter
          % cmd con due arg
          \def\insulti@ii#1#2{#1 è #2}
          % cmd con tre arg
          \def\insulti@iii#1#2#3{#1 e #2 sono #3}

          % comando delimitato
          \def\ins@ulti#1#2#3{
          \def\tmp@{#3}
          \ifx\tmp@\@nil
          \insulti@ii#1#2
          \else
          \insulti@iii#1#2#3
          \fi
          }

          % cmd utente
          \def\insulti#1{
          \ins@ulti#1\@nil}

          \makeatother
          `

          Per l’overloading, ho in mente il funzionamento di Java mentre per il numero variabile di argomenti penso all’ellipsis …
          Un saluto.
          R.

        • #69594
          Up
          0
          Down
          ::

          robitex” post=68714Uhm, continuo ancora ad essere dubbioso sulla possibilità di gestire un numero di argomenti variabili con TeX, per il semplice motivo che la ricerca dei token argomento compiuta da un comando è “fissa” (attendiamo pareri TeXnici).

          È per questo che dico che si può fare pur usando parentesi tonde o quadre anziché graffe. Le parentesi graffe vengono sempre “consumate” da TeX, mentre quelle tonde o quadre possiamo gestircele come meglio crediamo:

          `\documentclass[a4paper]{article}

          \usepackage[T1]{fontenc}
          \usepackage[utf8]{inputenc}
          \usepackage[italian]{babel}
          \usepackage{xspace}

          \makeatletter
          \def\insulto(#1)(#2){%
          \@ifnextchar({#1\insulto@@(#2)}{\insulto@{#1}{#2}}}
          \def\insulto@#1#2{%
          #1 è #2\xspace}
          \def\insulto@@(#1)(#2){%
          \@ifnextchar({, #1\insulto@@(#2)}{ e #1 sono #2\xspace}}
          \makeatother

          \begin{document}
          \begin{itemize}
          \item \insulto(luca)(scemo);
          \item \insulto(marco)(francesco)(cretini);
          \item \insulto(marco)(francesco)(giuseppe)(stupidi).
          \item \insulto(marco)(francesco)(giuseppe)(giovanni)(idioti).
          \end{itemize}
          \end{document}`

          Serve xspace perché \@ifnextchar si mangia gli spazi, quindi in alcuni casi bisogna rimetterceli (ci pensa \xspace).

          A meno che nel codice del comando a due argomenti non si inserisca un \@gobble o qualcosa del genere.
          Tipo:
          `
          \makeatletter
          % cmd con due arg
          \def\insulti@ii#1#2{#1 è #2}
          % cmd con tre arg
          \def\insulti@iii#1#2#3{#1 e #2 sono #3}

          % comando delimitato
          \def\ins@ulti#1#2#3{
          \def\tmp@{#3}
          \ifx\tmp@\@nil
          \insulti@ii#1#2
          \else
          \insulti@iii#1#2#3
          \fi
          }

          % cmd utente
          \def\insulti#1{
          \ins@ulti#1\@nil}

          \makeatother
          `

          Non capisco come dovrei usare il tuo codice.
          `\insulti{luca}{scemo} e \insulti{marco}{francesco}{cretini}`
          non mi funziona.

          Per l’overloading, ho in mente il funzionamento di Java mentre per il numero variabile di argomenti penso all’ellipsis …
          Un saluto.
          R.

          Esatto! Più o meno è lo stesso in C++. La firma del metodo cambia anche in dipendenza del numero di argomenti.

          Ciao,
          Antonio

        • #69595
          Up
          0
          Down
          ::

          robitex” post=68714Uhm, continuo ancora ad essere dubbioso sulla possibilità di gestire un numero di argomenti variabili con TeX, per il semplice motivo che la ricerca dei token argomento compiuta da un comando è “fissa” (attendiamo pareri TeXnici).

          Scusa, ti do perfettamente ragione, non si ha certo “overloading dei nomi dei comandi”. Concordo con te (per quanto ne so) sul fatto che in TeX non esiste una cosa simile, per il semplice motivo che a identificare un comando è il solo nome. Tutti i linguaggi che supportano overloading introducono il concetto di firma di una funzione, che considera anche gli argomenti. In TeX, quello che si può fare è emularlo, come nel mio precedente esempio.

          Ciao,
          Antonio

        • #69596
          robitex
          Amministratore del forum
            Up
            0
            Down
            ::

            antonio.macrì” post=68719

            Uhm, continuo ancora ad essere dubbioso sulla possibilità di gestire un numero di argomenti variabili con TeX, per il semplice motivo che la ricerca dei token argomento compiuta da un comando è “fissa” (attendiamo pareri TeXnici).

            Scusa, ti do perfettamente ragione, non si ha certo “overloading dei nomi dei comandi”. Concordo con te (per quanto ne so) sul fatto che in TeX non esiste una cosa simile, per il semplice motivo che a identificare un comando è il solo nome. Tutti i linguaggi che supportano overloading introducono il concetto di firma di una funzione, che considera anche gli argomenti. In TeX, quello che si può fare è emularlo, come nel mio precedente esempio.

            Ciao,
            Antonio

            Si, il codice che ho postato non funziona (sono anche un po’ arrugginito di TeX), era solo un tentativo per toccare con mano che senza un delimitatore (l’informazione aggiuntiva che in pratica da conto del numero degli argomenti) non si riesce a capire in quale caso siamo e comunque occorre una qualche acrobazia come questa, più semplice delle parentesi tonde (certo che il nostro utente poteva trovare un nome di comando diverso…):

            `\documentclass{minimal}
            \usepackage[utf8]{inputenc}

            \makeatletter
            % cmd con due arg
            \def\insulti@ii#1#2{#1 è #2}
            % cmd con tre arg
            \def\insulti@iii#1#2#3{#1 e #2 sono #3}

            % cmd utente
            \def\insulti#1#2#3;{%
            \def\tmp@{#3}%
            \ifx\tmp@\@empty
            \insulti@ii{#1}{#2}%
            \else
            \insulti@iii{#1}{#2}{#3}%
            \fi
            }
            \makeatother

            \begin{document}

            \insulti{Paolo}{Andrea}{pasticcioni};

            \insulti{Paolo}{furbetto};

            \end{document}`
            Un saluto.
            R.

          • #69597
            Up
            0
            Down
            ::

            albertobosia” post=68707è possibile gestire l’overloading degli operatori in LaTeX?
            l’ideale sarebbe poter fare qualcosa di questo tipo
            `\newcommand{\insulto}[2]{#1 è #2}
            \newcommand{\insulto}[3]{#1 e #2 sono #3}
            \insulto{luca}{scemo} e \insulto{marco}{francesco}{cretini}`
            ho provato a giocare sui newcommand ma non riesco a concludere molto…

            `\documentclass[a4paper]{article}
            \usepackage{xparse}
            \ExplSyntaxOn
            \NewDocumentCommand{\insulto}{m m}
            {
            \seq_set_split:Nnn \l_tmpa_seq { , } { #1 }
            \seq_pop_right:NN \l_tmpa_seq \l_tmpa_tl
            \seq_map_inline:Nn \l_tmpa_seq { ##1~ }
            \int_compare:nTF { \seq_length:N \l_tmpa_seq > 0 }
            { e~\l_tmpa_tl\c_space_tl sono~}
            {\l_tmpa_tl\c_space_tl \`e~}
            #2
            }
            \ExplSyntaxOff
            \begin{document}
            \insulto{luca}{birichino}

            \insulto{marco,francesco}{zoticoni}
            \end{document}`
            1. Il primo argomento viene spezzato alle virgole e inserito in una sequenza
            2. L’ultimo elemento della sequenza viene tolto e inserito in una variable token
            3. Si producono uno alla volta gli elementi della sequenza, separati da uno spazio.
            4. Se la sequenza ha lunghezza zero (cioè c’era un solo nome), si produce il nome seguito da “è”
            5. Se la sequenza ha lunghezza maggiore di zero si produce “e”, l’ultimo nome e, per finire, “sono”.

            Ciao
            Enrico

          • #69598
            robitex
            Amministratore del forum
              Up
              0
              Down
              ::

              egreg9″ post=68725

              è possibile gestire l’overloading degli operatori in LaTeX?
              l’ideale sarebbe poter fare qualcosa di questo tipo
              `\newcommand{\insulto}[2]{#1 è #2}
              \newcommand{\insulto}[3]{#1 e #2 sono #3}
              \insulto{luca}{scemo} e \insulto{marco}{francesco}{cretini}`
              ho provato a giocare sui newcommand ma non riesco a concludere molto…

              `\documentclass[a4paper]{article}
              \usepackage{xparse}
              \ExplSyntaxOn
              \NewDocumentCommand{\insulto}{m m}
              {
              \seq_set_split:Nnn \l_tmpa_seq { , } { #1 }
              \seq_pop_right:NN \l_tmpa_seq \l_tmpa_tl
              \seq_map_inline:Nn \l_tmpa_seq { ##1~ }
              \int_compare:nTF { \seq_length:N \l_tmpa_seq > 0 }
              { e~\l_tmpa_tl\c_space_tl sono~}
              {\l_tmpa_tl\c_space_tl \`e~}
              #2
              }
              \ExplSyntaxOff
              \begin{document}
              \insulto{luca}{birichino}

              \insulto{marco,francesco}{zoticoni}
              \end{document}`
              1. Il primo argomento viene spezzato alle virgole e inserito in una sequenza
              2. L’ultimo elemento della sequenza viene tolto e inserito in una variable token
              3. Si producono uno alla volta gli elementi della sequenza, separati da uno spazio.
              4. Se la sequenza ha lunghezza zero (cioè c’era un solo nome), si produce il nome seguito da “è”
              5. Se la sequenza ha lunghezza maggiore di zero si produce “e”, l’ultimo nome e, per finire, “sono”.

              Ciao
              Enrico

              Sembra divertente lavorare con LaTeX3. Speriamo di avere il tempo per approfondire questo nuovo stiule di programmazione TeX.
              A questo proposito ti chiedo Enrico, se è necessario lavorare molto per apprenderlo e se hai in mente qualche tipo di guida…

              Un saluto.
              R.

            • #69599
              Up
              0
              Down
              ::


              Per sbaglio (cercando altro) ho trovato questa discussione su TeX-StackExchange.

              antonio.macrì” post=68716[…] È per questo che dico che si può fare pur usando parentesi tonde o quadre anziché graffe. Le parentesi graffe vengono sempre “consumate” da TeX, mentre quelle tonde o quadre possiamo gestircele come meglio crediamo…

              Sbagliavo: si può fare anche con le parentesi graffe. Il trucco è usare [tt]\bgroup[/tt] per indicare [tt]{[/tt].

              `\documentclass[a4paper]{article}

              \usepackage[T1]{fontenc}
              \usepackage[utf8]{inputenc}
              \usepackage[italian]{babel}
              \usepackage{xspace}

              \makeatletter
              \def\regione#1#2{%
              \@ifnextchar\bgroup{#1\regione@@{#2}}{\regione@{#1}{#2}}}
              \def\regione@#1#2{%
              #1 è #2\xspace}
              \def\regione@@#1#2{%
              \@ifnextchar\bgroup{, #1\regione@@{#2}}{ e #1 sono #2\xspace}}
              \makeatother

              \begin{document}
              \begin{itemize}
              \item \regione{silvia}{sarda};
              \item \regione{francesco}{marco}{abbruzzesi};
              \item \regione{maurizio}{aldo}{giuseppe}{pugliesi};
              \item \regione{antonio}{giovanni}{luca}{carlo}{siciliani}.
              \end{itemize}

              \regione{silvia}{sarda} mentre
              \regione{francesco}{marco}{abbruzzesi};
              \regione{maurizio}{aldo}{giuseppe}{pugliesi};
              \regione{antonio}{giovanni}{luca}{carlo}{siciliani}.

              \end{document}`

              Rimane il fatto, come precisava Roberto, che non si tratta di “vero” overloading.
              In ogni caso, la notazione di Enrico è certamente più compatta e semplice.

            • #69600
              robitex
              Amministratore del forum
                Up
                0
                Down
                ::

                antonio.macrì” post=69468Per sbaglio (cercando altro) ho trovato questa discussione su TeX-StackExchange.

                […] È per questo che dico che si può fare pur usando parentesi tonde o quadre anziché graffe. Le parentesi graffe vengono sempre “consumate” da TeX, mentre quelle tonde o quadre possiamo gestircele come meglio crediamo…

                Sbagliavo: si può fare anche con le parentesi graffe. Il trucco è usare [tt]\bgroup[/tt] per indicare [tt]{[/tt].

                `\documentclass[a4paper]{article}

                \usepackage[T1]{fontenc}
                \usepackage[utf8]{inputenc}
                \usepackage[italian]{babel}
                \usepackage{xspace}

                \makeatletter
                \def\regione#1#2{%
                \@ifnextchar\bgroup{#1\regione@@{#2}}{\regione@{#1}{#2}}}
                \def\regione@#1#2{%
                #1 è #2\xspace}
                \def\regione@@#1#2{%
                \@ifnextchar\bgroup{, #1\regione@@{#2}}{ e #1 sono #2\xspace}}
                \makeatother

                \begin{document}
                \begin{itemize}
                \item \regione{silvia}{sarda};
                \item \regione{francesco}{marco}{abbruzzesi};
                \item \regione{maurizio}{aldo}{giuseppe}{pugliesi};
                \item \regione{antonio}{giovanni}{luca}{carlo}{siciliani}.
                \end{itemize}

                \regione{silvia}{sarda} mentre
                \regione{francesco}{marco}{abbruzzesi};
                \regione{maurizio}{aldo}{giuseppe}{pugliesi};
                \regione{antonio}{giovanni}{luca}{carlo}{siciliani}.

                \end{document}`

                Rimane il fatto, come precisava Roberto, che non si tratta di “vero” overloading.
                In ogni caso, la notazione di Enrico è certamente più compatta e semplice.

                Interessante. La cosa funziona ha condizione, naturalmente, che nessun carattere { segua il comando.
                Penso quindi che il codice da te presentato nasconda intelligentemente il carattere di fine lista argomenti proprio in {.

                Chiassà in LuaTeX cosa si potrebbe fare.
                Alla prossima.
                R.

            Visualizzazione 9 filoni di risposte
            • Devi essere connesso per rispondere a questo topic.

            Go to top