How can I set variable in other namespace equal to variable in procedure?

StackOverflow https://stackoverflow.com/questions/23168348

  •  06-07-2023
  •  | 
  •  

Question

I have TCL code:

namespace eval gen {
    proc generate { } {
        set language "C"
        namespace eval current_file_generation_info {
            variable language $language
        }
    }
}

At line variable language $language I am trying to set variable language in namespace current_file_generation_info to the value of variable language inside procedure generate. My code gives me error something like "language variable does not exists" and I understand why it does so.

So my question is, how can I set the variable language in namespace current_file_generation_info equal to variable language inside generate procedure?

Était-ce utile?

La solution

The simplest way is to just name the target namespace in the variable call, but if you do that, you should make the namespace as a separate step (if it is possible to call the code at a point when the NS wasn't already created).

namespace eval gen {
    proc generate { } {
        # Make the namespace by running an empty script in it
        namespace eval current_file_generation_info {}
        # Initialise the variable
        variable current_file_generation_info::language "C"
    }
}

Otherwise, you could do:

namespace eval gen {
    proc generate { } {
        namespace eval current_file_generation_info \
                [list variable language "C"]
    }
}

Hint: the list command is very good at generating substitution-free scripts that call a single command.

Autres conseils

namespace eval gen {
    proc generate { } {
        set language "C"
        set [namespace current]::language $language
    }
    generate
    variable language
    puts $language
}

It would be clearer to avoid using the same variable name for a local var and a namespace var

namespace eval gen {
    proc generate { } {
        variable language
        set _language "C"
        set language $_language
    }
}

or just omit the local var

namespace eval gen {
    proc generate { } {
        variable language
        set language "C"
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top