LuaTeX: copiare la struttura A in B. Problema

  • Questo topic ha 1 risposta, 2 partecipanti ed è stato aggiornato l'ultima volta 15 anni fa da robitex.
  • Creatore
    Topic
  • #62810
    Up
    0
    Down
    ::


    Ciao a tutti.

    E’ una domanda che riguarda più Lua che LuaTeX, comunque riporto il seguente esempio

    `
    % !TEX encoding = UTF-8
    % !TEX program = LuaLaTeX
    \documentclass{report}

    \def\pr#1{\directlua{tex.print(tostring(#1))}}

    \parindent=0pt
    \begin{document}
    \directlua{
    A = {a = {1,2,3},
    b = {4,5,6}}
    B = A
    B.b[1] =99

    X = 10
    Y = X
    Y = 2
    }
    $\texttt{B.b[1]}=\pr{B.b[1]}$%

    $\texttt{A.b[1]}=\pr{A.b[1]}$

    Come mai? Sembra che copi i “puntatori” e non la tabella, infatti:
    \begin{description}
    \item\pr{B}
    \item[A]\pr{A}
    \end{description}
    sono %
    \directlua{
    if tostring(A)==tostring(B) then
    tex.print(“uguali.”)
    else
    tex.print(“diversi.”)
    end
    }

    Invece se le variabili sono scalari, \pr{Y} uguale a \pr{X}. Va bene.

    \end{document}
    `

    Come posso copiare la struttura A in un’altra variabile in modo che se modifico quest’ultima, non mi alteri anche l’originale?

    Grazie

    Michele

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

        azoun” post=61770Ciao a tutti.

        E’ una domanda che riguarda più Lua che LuaTeX, comunque riporto il seguente esempio

        `
        % !TEX encoding = UTF-8
        % !TEX program = LuaLaTeX
        \documentclass{report}

        \def\pr#1{\directlua{tex.print(tostring(#1))}}

        \parindent=0pt
        \begin{document}
        \directlua{
        A = {a = {1,2,3},
        b = {4,5,6}}
        B = A
        B.b[1] =99

        X = 10
        Y = X
        Y = 2
        }
        $\texttt{B.b[1]}=\pr{B.b[1]}$%

        $\texttt{A.b[1]}=\pr{A.b[1]}$

        Come mai? Sembra che copi i “puntatori” e non la tabella, infatti:
        \begin{description}
        \item\pr{B}
        \item[A]\pr{A}
        \end{description}
        sono %
        \directlua{
        if tostring(A)==tostring(B) then
        tex.print(“uguali.”)
        else
        tex.print(“diversi.”)
        end
        }

        Invece se le variabili sono scalari, \pr{Y} uguale a \pr{X}. Va bene.

        \end{document}
        `

        Come posso copiare la struttura A in un’altra variabile in modo che se modifico quest’ultima, non mi alteri anche l’originale?

        Grazie

        Michele

        Ciao,
        normalissimo comportamento infatti in Lua le tabelle sono oggetti e le variabili sono dei riferimenti ad esso. Se si copiano le variabili si copiano i riferimenti alla stessa tabella.

        Occorre quindi fare una copia valore per valore della tabella, magari ricorsivamente se la tabella contiene altre tabelle (deep copy).
        Nel tuo caso creerei una funzione di copia più semplice sapendo quale struttura ha la tabella da copiare.
        Un doppio ciclo for con l’uso degli iteratori.
        Bye

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

    Go to top