Deutsch   English   Français   Italiano  
<20241129201601.dde7fad0c89a3239a0ae6b8a@example.invalid>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!news.misty.com!weretis.net!feeder9.news.weretis.net!news.quux.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: Emiliano <emiliano@example.invalid>
Newsgroups: comp.lang.tcl
Subject: Re: Parsing namespace name strings
Date: Fri, 29 Nov 2024 20:16:01 -0300
Organization: A noiseless patient Spider
Lines: 56
Message-ID: <20241129201601.dde7fad0c89a3239a0ae6b8a@example.invalid>
References: <vida8m$186cp$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Injection-Date: Sat, 30 Nov 2024 00:16:03 +0100 (CET)
Injection-Info: dont-email.me; posting-host="9d1ba3a732f9551777d5f906e292bc55";
	logging-data="1356397"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX1+ElSyV+CH8JhVUr9PBnzy40rXBrwApc1k="
Cancel-Lock: sha1:39wFjnorP3uXE3q8T00Bd2JIBL4=
X-Newsreader: Sylpheed 3.5.1 (GTK+ 2.24.32; i686-pc-linux-gnu)
Bytes: 2560

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