On 29 July 2013 14:43, Tina Harriott <[email protected]> wrote: > On 29 July 2013 03:17, 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!! >> > > Not that this is a beauty contest, but I like the concept of > com.att.research.hello or ca.uwaterloo.math.statistics1.util, too. It > would be very very useful if you can get it working. > > I'd imagine it would just work like wrapping your favourite functions > into a statement like namespace ca.uwaterloo.math.statistics1.util {} > and you can share them without risk, right?
Yes, that would be the general idea. Ced -- Cedric Blancher <[email protected]> Institute Pasteur _______________________________________________ ast-users mailing list [email protected] http://lists.research.att.com/mailman/listinfo/ast-users
