zsh-workers
 help / color / mirror / code / Atom feed
From: Bart Schaefer <schaefer@brasslantern.com>
To: zsh-workers@zsh.org
Subject: Re: Proof of concept: "static" parameter scope
Date: Fri, 25 Sep 2015 22:23:12 -0700	[thread overview]
Message-ID: <150925222312.ZM12569@torch.brasslantern.com> (raw)
In-Reply-To: <20150925101540.5d2ded9c@pwslap01u.europe.root.pri>

On Sep 25, 10:15am, Peter Stephenson wrote:
} Subject: Re: Proof of concept: "static" parameter scope
}
} On Thu, 24 Sep 2015 19:23:05 -0700
} Bart Schaefer <schaefer@brasslantern.com> wrote:
} > Modules can't declare keywords, so this isn't able to support the new
} > array assignment syntax used by "local" et al.  However, the entry point
} > is coded to match that call signature.
} 
} I think the biggest issue with fixing this is it's going to change the
} "features" interface to modules as we'll have to add a feature type that
} defines a typeset-style interface (and a corresponding reserved word,
} but I think we can tie the two together).

Or ... 


diff --git a/Doc/Zsh/mod_static.yo b/Doc/Zsh/mod_static.yo
index 4342a92..6b461e7 100644
--- a/Doc/Zsh/mod_static.yo
+++ b/Doc/Zsh/mod_static.yo
@@ -36,6 +36,11 @@ parameter.  This may change in the future.
 )
 enditem()
 
+The module also adds the option `tt(-S)' to the `tt(local)' builtin.
+Using `tt(local -S)' is equivalent to calling `tt(static)', but allows
+use of array assignment (parenthesized word list) syntax in the
+declaration.
+
 Parameters declared with tt(static) have the following properties:
 ifnzman()
 startitemize()
diff --git a/Src/Modules/param_static.c b/Src/Modules/param_static.c
index b6c2403..c5354b2 100644
--- a/Src/Modules/param_static.c
+++ b/Src/Modules/param_static.c
@@ -172,6 +172,13 @@ bin_static(char *nam, char **args, LinkList assigns, Options ops, int func)
     int from_typeset = 1;
     makestatic_error = 0;
 
+    if (!OPT_ISSET(ops, 'S'))
+	return bin_typeset(nam, args, assigns, ops, func);
+    else if (OPT_ISSET(ops, 'T')) {
+	zwarn("bad option: -T");
+	return 1;
+    }
+
     if (locallevel == 0) {
 	if (isset(WARNCREATEGLOBAL))
 	    zwarnnam(nam, "invalid local scope, using globals");
@@ -495,7 +502,7 @@ printstaticnode(HashNode hn, int printflags)
 
 static struct builtin bintab[] = {
     /* Copied almost verbatim from BUILTIN("local") */
-    BUILTIN("static", BINF_PLUSOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL | BINF_ASSIGN, (HandlerFunc)bin_static, 0, -1, 0, "AE:%F:%HL:%R:%UZ:%ahi:%lprtux", NULL)
+    BUILTIN("static", BINF_PLUSOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL | BINF_ASSIGN, (HandlerFunc)bin_static, 0, -1, 0, "AE:%F:%HL:%R:%SUZ:%ahi:%lprtux", "S")
 };
 
 static struct features module_features = {
@@ -506,16 +513,27 @@ static struct features module_features = {
     0
 };
 
+/* Same optstr as BUILTIN("local") but with 'S' added */
+static char *optstr_local = "AE:%F:%HL:%R:%STUZ:%ahi:%lprtux";
+static struct builtin save_local;
+
 /**/
 int
 setup_(UNUSED(Module m))
 {
+    HashNode hn = builtintab->getnode(builtintab, "local");
+
     /* Horrible, horrible hack */
     getparamnode = realparamtab->getnode;
     realparamtab->getnode = getstaticnode;
     realparamtab->getnode2 = getstaticnode2;
     realparamtab->printnode = printstaticnode;
 
+    /* Even more horrible hack */
+    save_local = *(Builtin)hn;
+    ((Builtin)hn)->handlerfunc = bintab[0].handlerfunc;
+    ((Builtin)hn)->optstr = optstr_local;
+
     return 0;
 }
 
@@ -546,6 +564,9 @@ boot_(Module m)
 int
 cleanup_(Module m)
 {
+    HashNode hn = builtintab->getnode(builtintab, "local");
+    *(Builtin)hn = save_local;
+    
     realparamtab->getnode = getparamnode;
     realparamtab->getnode2 = gethashnode2;
     realparamtab->printnode = printparamnode;
diff --git a/Test/V10static.ztst b/Test/V10static.ztst
index 11f54e0..cc69db7 100644
--- a/Test/V10static.ztst
+++ b/Test/V10static.ztst
@@ -50,8 +50,7 @@
  # Depends on zsh-5.0.9 typeset keyword
  typeset -a array_test=(top level)
  () {
-  static -a array_test
-  array_test=(in function)
+  local -Sa array_test=(in function)
   () {
    static array_test
    print $+array_test
@@ -107,7 +106,7 @@
   print ${(t)hash_test} ${(kv)hash_test}
  }
  outer () {
-  static -A hash_test; hash_test=(in function)
+  local -SA hash_test=(in function)
   typeset -p hash_test
   inner
  }
@@ -159,7 +158,7 @@ F:note "typeset" rather than "static" in output from outer
   $ZTST_testdir/../Src/zsh -fc 'print X $array_test'
  }
  () {
-  static -ax array_test; array_test=(whaat)
+  local -Sax array_test=(whaat)
   print Y $array_test
   $ZTST_testdir/../Src/zsh -fc 'print X $array_test'
   inner
@@ -195,7 +194,7 @@ F:note "typeset" rather than "static" in output from outer
 
  typeset -A hash_test=(top level)
  () {
-  static -A hash_test; hash_test=(in function)
+  local -SA hash_test=(in function)
   () {
    print X ${(kv)hash_test}
   }
@@ -209,7 +208,7 @@ F:note "typeset" rather than "static" in output from outer
 
  typeset -A hash_test=(top level)
  () {
-  static -A hash_test; hash_test=(in function)
+  local -SA hash_test=(in function)
   () {
    print X ${(kv)hash_test}
    hash_test[in]=deeper
@@ -224,8 +223,8 @@ F:note "typeset" rather than "static" in output from outer
 
  typeset -A hash_test=(top level)
  () {
-  static -a array_test; array_test=(in function)
-  static -A hash_test; hash_test=($array_test)
+  local -Sa array_test=(in function)
+  local -SA hash_test=($array_test)
   () {
    print X ${(kv)hash_test}
    hash_test=(even deeper)
@@ -241,7 +240,7 @@ F:note "typeset" rather than "static" in output from outer
 
  typeset -A hash_test=(top level)
  () {
-  static -A hash_test; hash_test=(in function)
+  local -SA hash_test=(in function)
   () {
    print X ${(kv)hash_test}
    unset hash_test


  reply	other threads:[~2015-09-26  5:23 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-25  2:23 Bart Schaefer
2015-09-25  9:15 ` Peter Stephenson
2015-09-26  5:23   ` Bart Schaefer [this message]
2015-09-30 19:38   ` Peter Stephenson
2015-10-01  0:27     ` Bart Schaefer
2015-10-03 19:19       ` Peter Stephenson
2015-10-03 23:43         ` Autoloaded keywords (Re: Proof of concept: "static" parameter scope) Bart Schaefer
2015-10-05 21:55         ` Proof of concept: "static" parameter scope Daniel Shahaf
2015-10-05 22:17           ` Bart Schaefer
2015-10-05 22:36             ` Daniel Shahaf
2015-10-05 23:01               ` Bart Schaefer
2015-10-06  8:40           ` Peter Stephenson
2015-09-28 17:04 ` Oliver Kiddle
2015-09-28 17:58   ` Roman Neuhauser
2015-09-29 23:31     ` Andrew Janke
2015-09-30  3:06       ` Bart Schaefer
2015-09-28 19:42   ` Mikael Magnusson
2015-09-29  1:23     ` Bart Schaefer
2015-09-29  8:39       ` Peter Stephenson
2015-09-29 22:34       ` Daniel Shahaf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=150925222312.ZM12569@torch.brasslantern.com \
    --to=schaefer@brasslantern.com \
    --cc=zsh-workers@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).