Prefer builtin commands to macros in GHCi command resolution (#3858)
authorMax Bolingbroke <batterseapower@hotmail.com>
Sat, 2 Apr 2011 22:59:06 +0000 (23:59 +0100)
committerMax Bolingbroke <batterseapower@hotmail.com>
Sat, 2 Apr 2011 22:59:06 +0000 (23:59 +0100)
Current precedence rules in GHCi are that:

 * User macros are *always* preferred in command resolution
 * User macros that are defined earlier are preferred to those that
   are defined earlier on
 * Builtin commands have lowest precedence

However this caused user confusion because e.g. defining a macro beginning
with "i" would override the standard :info command whenever the user typed
the abbreviated command :i.

The new precedence rules are based on the view that things defined earlier
are always preferred to things defined later. The builtin commands are logically
defined earliest of all (when GHCi starts) so they always take precedence.

ghc/InteractiveUI.hs

index 3062133..2685377 100644 (file)
@@ -848,8 +848,11 @@ lookupCommand' str' = do
   macros <- readIORef macros_ref
   let{ (str, cmds) = case str' of
       ':' : rest -> (rest, builtin_commands)
   macros <- readIORef macros_ref
   let{ (str, cmds) = case str' of
       ':' : rest -> (rest, builtin_commands)
-      _ -> (str', macros ++ builtin_commands) }
+      _ -> (str', builtin_commands ++ macros) }
   -- look for exact match first, then the first prefix match
   -- look for exact match first, then the first prefix match
+  -- We consider builtin commands first: since new macros are appended
+  -- on the *end* of the macros list, this is consistent with the view
+  -- that things defined earlier should take precedence. See also #3858
   return $ case [ c | c <- cmds, str == cmdName c ] of
            c:_ -> Just c
            [] -> case [ c | c@(s,_,_) <- cmds, str `isPrefixOf` s ] of
   return $ case [ c | c <- cmds, str == cmdName c ] of
            c:_ -> Just c
            [] -> case [ c | c@(s,_,_) <- cmds, str `isPrefixOf` s ] of