Jürgen,

I submitted this patch in a slightly different form once before; it
didn't make it into GNU APL.

After having lived with the patch for a while on my own system, I've
updated it to the current form.

The gist of the patch is to acknowledge redefinition of a ]usercmd with
*identical* arguments as being successful rather than complaining about
a "BAD COMMAND". The patch does not change the effect of the command,
only the report.

With the patch, GNU APL will report
 "User-defined command ]... installed"
each time a command is defined with identical arguments.

I think this is a better response than complaining
 "BAD COMMAND"
in the same circumstance, given that the behavior actually succeeded.

I hope that you'll apply this patch to GNU APL.

Best wishes,
  David

Index: src/Command.cc
===================================================================
--- src/Command.cc	(revision 294)
+++ src/Command.cc	(working copy)
@@ -837,6 +837,33 @@
    return true;
 }
 //-----------------------------------------------------------------------------
+bool
+Command::check_redefinition(ostream & out, const UCS_string & cnew,
+                            const UCS_string fnew, const int mnew)
+{
+   loop(u, user_commands.size())
+     {
+       const UCS_string cold = user_commands[u].prefix;
+       const UCS_string fold = user_commands[u].apl_function;
+       const int mold = user_commands[u].mode;
+
+       if (cnew != cold)   continue;
+
+       // user command name matches; so must mode and function
+       if (mnew != mold || fnew != fold)
+         {
+           out << "BAD COMMAND" << endl;
+           Workspace::more_error() 
+             = UCS_string(
+                          "conflict with existing user command definition"
+                          " in command ]USERCMD");
+         }
+       return true;
+     }
+
+   return false;
+}
+//-----------------------------------------------------------------------------
 void
 Command::cmd_USERCMD(ostream & out, const UCS_string & cmd,
                      vector<UCS_string> & args)
@@ -922,8 +949,12 @@
 #define cmd_def(cmd_str, _cod, arg) \
    if (check_name_conflict(out, cmd_str, args[0]))   return;
 #include "Command.def"
-   loop(u, user_commands.size())
-       if (check_name_conflict(out, args[0], user_commands[u].prefix))   return;
+   if (check_redefinition(out, args[0], args[1], mode))
+     {
+       out << "    User-defined command "
+           << args[0] << " installed." << endl;
+       return;
+     }
 
    // check APL function name
    //
Index: src/Command.hh
===================================================================
--- src/Command.hh	(revision 294)
+++ src/Command.hh	(working copy)
@@ -121,6 +121,9 @@
    static bool check_name_conflict(ostream & out, const UCS_string & cnew,
                                    const UCS_string cold);
 
+   static bool check_redefinition(ostream & out, const UCS_string & cnew,
+                                  const UCS_string fnew, const int mnew);
+
    /// a helper struct for the )IN command
    struct transfer_context
       {

Reply via email to