• Re: Parsing namespace name strings

    From Emiliano@21:1/5 to Alan Grunwald on Fri Nov 29 20:16:01 2024
    On Fri, 29 Nov 2024 21:03:25 +0000
    Alan Grunwald <nospam.nurdglaw@gmail.com> wrote:

    I find I regularly want to know things like "what is first part of a namespace name", "the first two parts" etc. I generally want to get the
    same answer whether the name is a::b::c or ::a::b::c.

    I can (and do) do this by getting a list of parts via something like

    split [string map {"::" ":"} $name] ":"

    but this is clunky - is there something like [namespace split] that
    would return a list of parts?

    For example, I'd like namespace split a::b::c to return {a b c}, and namespace split ::d::e::f::g to return {d e f g}.

    Easy combining [namespace tail] and [namespace qualifiers]:

    proc ns2list {ns} {
    set l {}
    while {$ns ne {}} {
    lappend l [namespace tail $ns]
    set ns [namespace qualifiers $ns]
    }
    lreverse $l
    }

    % ns2list foo::bar::
    foo bar {}
    % ns2list foo::bar
    foo bar
    % ns2list ::::foo::bar::
    foo bar {}
    % ns2list ::foo::bar
    foo bar
    % ns2list {}
    %


    As a followup, if I write a proc namespaceSplit that does what I want,
    is there a user-level way to modify the [namespace] command so that a
    can execute namespaceSplit via [namespace split]?

    Since the [namespace] command is an ensemble, its easy to add a subcommand

    % namespace ensemble configure namespace -map [dict merge [namespace ensemble configure namespace -map] {split ::ns2list}]
    % namespace split ::foo::bar::baz
    foo bar baz


    Many thanks

    Regards
    --
    Emiliano

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)