diff options
author | Steve Bennett <steveb@workware.net.au> | 2010-10-31 14:15:07 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2011-05-09 10:29:11 +1000 |
commit | 24bbe8f092cabff79c990a9ecca030002b9acb6d (patch) | |
tree | a4f96e5cece61f3004aa8c97e38ed23e3bb92eb9 | |
parent | 7474537fa2458d02f0e1efb97ba35fdd2e68db28 (diff) | |
download | jimtcl-24bbe8f092cabff79c990a9ecca030002b9acb6d.zip jimtcl-24bbe8f092cabff79c990a9ecca030002b9acb6d.tar.gz jimtcl-24bbe8f092cabff79c990a9ecca030002b9acb6d.tar.bz2 |
Allow proc 'args' to be renamed
With this syntax: {args newname}.
This especially helps with documentation and error messages.
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r-- | jim.c | 49 | ||||
-rw-r--r-- | tests/proc-new.test | 21 |
2 files changed, 56 insertions, 14 deletions
@@ -9773,6 +9773,7 @@ int JimCallProcedure(Jim_Interp *interp, Jim_Cmd *cmd, const char *filename, int int arglen = Jim_ListLength(interp, cmd->argListObjPtr); for (i = 0; i < arglen; i++) { + Jim_Obj *objPtr; Jim_ListIndex(interp, cmd->argListObjPtr, i, &argObjPtr, JIM_NONE); Jim_AppendString(interp, argmsg, " ", 1); @@ -9781,11 +9782,18 @@ int JimCallProcedure(Jim_Interp *interp, Jim_Cmd *cmd, const char *filename, int Jim_AppendObj(interp, argmsg, argObjPtr); } else if (i == arglen - cmd->rightArity - cmd->args) { - Jim_AppendString(interp, argmsg, "?argument ...?", -1); + if (Jim_ListLength(interp, argObjPtr) == 1) { + /* We have plain args */ + Jim_AppendString(interp, argmsg, "?argument ...?", -1); + } + else { + Jim_AppendString(interp, argmsg, "?", 1); + Jim_ListIndex(interp, argObjPtr, 1, &objPtr, JIM_NONE); + Jim_AppendObj(interp, argmsg, objPtr); + Jim_AppendString(interp, argmsg, " ...?", -1); + } } else { - Jim_Obj *objPtr; - Jim_AppendString(interp, argmsg, "?", 1); Jim_ListIndex(interp, argObjPtr, 0, &objPtr, JIM_NONE); Jim_AppendObj(interp, argmsg, objPtr); @@ -9866,8 +9874,15 @@ int JimCallProcedure(Jim_Interp *interp, Jim_Cmd *cmd, const char *filename, int if (cmd->args) { Jim_Obj *listObjPtr = Jim_NewListObj(interp, argv, argc); - /* Use the 'args' name from the procedure args */ + /* Get the 'args' name from the procedure args */ Jim_ListIndex(interp, cmd->argListObjPtr, d, &argObjPtr, JIM_NONE); + + /* It is possible to rename args. */ + i = Jim_ListLength(interp, argObjPtr); + if (i == 2) { + Jim_ListIndex(interp, argObjPtr, 1, &argObjPtr, JIM_NONE); + } + Jim_SetVariable(interp, argObjPtr, listObjPtr); argv += argc; d++; @@ -12098,7 +12113,23 @@ static int Jim_ProcCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg Jim_Obj *argPtr; int len; + /* Examine a parameter */ Jim_ListIndex(interp, argv[2], i, &argPtr, JIM_NONE); + len = Jim_ListLength(interp, argPtr); + if (len == 0) { + Jim_SetResultString(interp, "procedure has argument with no name", -1); + return JIM_ERR; + } + if (len > 2) { + Jim_SetResultString(interp, "procedure has argument with too many fields", -1); + return JIM_ERR; + } + + if (len == 2) { + /* May be {args newname} */ + Jim_ListIndex(interp, argPtr, 0, &argPtr, JIM_NONE); + } + if (Jim_CompareStringImmediate(interp, argPtr, "args")) { if (args) { Jim_SetResultString(interp, "procedure has 'args' specified more than once", -1); @@ -12113,16 +12144,6 @@ static int Jim_ProcCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg } /* Does this parameter have a default? */ - Jim_GetString(argPtr, NULL); - len = Jim_ListLength(interp, argPtr); - if (len == 0) { - Jim_SetResultString(interp, "procedure has argument with no name", -1); - return JIM_ERR; - } - if (len > 2) { - Jim_SetResultString(interp, "procedure has argument with too many fields", -1); - return JIM_ERR; - } if (len == 1) { /* A required arg. Is it part of leftArity or rightArity? */ if (optionalArgs || args) { diff --git a/tests/proc-new.test b/tests/proc-new.test index c771575..1178e0c 100644 --- a/tests/proc-new.test +++ b/tests/proc-new.test @@ -77,4 +77,25 @@ test proc-2.4 "Real test of optional switches" { multiarg_search -nocase -glob c* {A a B b C c D d} } 4 +test proc-3.1 "Rename optional args" { + proc a {b {args vars}} { + } + catch {a} msg + set msg +} {wrong # args: should be "a b ?vars ...?"} + +test proc-3.2 "Rename optional args" { + proc a {b {args vars} c} { + } + catch {a} msg + set msg +} {wrong # args: should be "a b ?vars ...? c"} + +test proc-3.2 "Rename optional args" { + proc a {b {args vars}} { + return $vars + } + a B C D +} {C D} + testreport |