On Mon, Jul 29, 2013 at 3:17 AM, Wendy Lin <[email protected]> wrote: > On 28 July 2013 06:17, Roland Mainz <[email protected]> wrote: >> On Fri, Jul 12, 2013 at 4:42 AM, Wendy Lin <[email protected]> wrote: >>> On 12 July 2013 04:35, David Korn <[email protected]> wrote: >>>> cc: [email protected] >>>> Subject: Re: [ast-users] ksh -c 'namespace a.c.b { integer i=5 ; } ; ' => >>>> a.c.b: is not an identifier? >>>> -------- >>>> >>>>> How do I create a nested namespace? >>>>> >>>>> I tried this but it fails: >>>>> ksh -c 'namespace a.c.b { integer i=5 ; } ; ' >>>>> /home/wlin/bin/ksh: a.c.b: is not an identifier >>>>> >>>>> Wendy >>>>> >>>> >>>> namespace a >>>> { >>>> namespace c >>>> { >>>> namespace b >>>> { >>>> integer i=5 >>>> } >>>> } >>>> } >>> >>> I still get an error for this: >>> ksh -c 'namespace a { namespace b { integer i=5 ; } ; } ; printf "%d\n" >>> .a.b.i' >>> /home/wlin/bin/ksh: printf: .a.b.i: no parent >>> >>> I don't think this is the right way (semantically) because you can't >>> switch from namespace a.b.c to namespace b.g.y on the fly. >> >> The following test patch "fixes" the problem: >> -- snip -- >> diff -r -u original/src/cmd/ksh93/sh/xec.c >> build_i386_64bit_debug/src/cmd/ksh93/sh/xec.c >> --- src/cmd/ksh93/sh/xec.c 2013-07-25 02:37:26.000000000 +0200 >> +++ src/cmd/ksh93/sh/xec.c 2013-07-28 05:36:31.827214685 +0200 >> @@ -2710,8 +2710,10 @@ >> Namval_t *oldnspace = shp->namespace; >> int offset = stktell(stkp); >> int >> flag=NV_NOASSIGN|NV_NOARRAY|NV_VARNAME; >> +#if 0 >> if(cp) >> >> errormsg(SH_DICT,ERROR_exit(1),e_ident,fname); >> +#endif >> sfputc(stkp,'.'); >> sfputr(stkp,fname,0); >> np = >> nv_open(stkptr(stkp,offset),shp->var_tree,flag); >> -- snip -- >> >> If this gets applied then the following sample code finally works: >> -- snip -- >> # the next three lines are placeholders for the parent namespaces >> namespace com { true ; } >> namespace com.att { true ; } >> namespace com.att.research { true ; } >> >> # test namespace for AT&T Research >> namespace com.att.research.hello >> { >> function print_hello >> { >> print 'Hello World' >> } >> } >> >> # do somthing >> .com.att.research.hello.print_hello >> -- snip -- >> >> IMO this would finally a major step forward towards a common >> function/type library where each party has it's own namespace which is >> organised like DNA (see java why this is a good idea) >> >> * Notes: >> - At some point namerefs to functions, e.g. typeset -f -n would be >> usefull... e.g. nameref -f hello=.com.att.research.hello.print_hello # >> would map the function .com.att.research.hello.print_hello to the >> short name "hello" without requiring a wrapper function (saving >> execution name) >> >> - Known bugs: >> $ ksh -c 'namespace a { true ; } ; namespace a.sp1 { integer i=5 ; >> function inc { let i++ ; } ; } ; print ${.a.sp1.i} ; .a.sp1.inc ; >> print ${.a.sp1.i} ' # print $'5\n5' but should print $'5\n6' >> >> Comments/feedback/rants/etc. wecome... > > I like it. It improves a lot over perl module madness. > > One rfe: mkdir has option -p to create missing parent dirs. Could you > add namespace -p to add missing namespaces, i.e. create empty > namespaces if they are not set yet? > > Aside from namespace -p the idea of adding namespaces like a DNS tree is > GREAT!!
Interesting. namespace --man doesn't work. Is this because namespace is a special command or an element of the language? Irek _______________________________________________ ast-users mailing list [email protected] http://lists.research.att.com/mailman/listinfo/ast-users
