8
$\begingroup$

Once a Package like abc` has been installed, we can use "?abc`*" to scan all the functions defined in this Package. Now I write a Package(abc`). After I have installed it, I use ?abc`* to scan the functions. But the function list is out-of-order. How can I set the function list to alphabetical order using ?abc`* ?

$\endgroup$
  • $\begingroup$ Have you tried to input the functions in your package in alphabetical order? $\endgroup$ – eldo Aug 19 '14 at 18:37
  • $\begingroup$ @eldo yes, I just do like this. but there is no effect. $\endgroup$ – yyteen Aug 19 '14 at 18:46
  • $\begingroup$ I don't think there is a way to modify the ordering of Information[]; the output is a side-effect(so things like Sort wouldn't work on it even if the output was sortable), though I've always seen it come back in sorted order(though note it's done according to Sort's ordering convention). $\endgroup$ – Nick Lariviere Aug 19 '14 at 19:08
  • $\begingroup$ Did you use lowercase function names? I saw ? "abc`*" and did you define function::usage $\endgroup$ – hieron Aug 19 '14 at 19:48
  • $\begingroup$ Thanks for the Accept. Please see my updated answer for what I feel is a much better solution than the first one I posted. $\endgroup$ – Mr.Wizard Aug 20 '14 at 2:58
8
$\begingroup$

Description

  • ? at the beginning of a line is the short from of Information.

  • Given a pattern that matches multiple Symbols Information returns a list of them in alphabetical (canonical) order, in columns top to bottom and left to right. You are therefore asking how you can modify the behavior of this System function.

  • You would need some way of storing the order that you wish to have these Symbol links displayed in.

Observations

The documentation for Names says:

  • Names["string"] gives the same list of names as ?string.

In fact testing indicates that Names is directly used by Information to retrieve the list of Symbol names:

Block[
 {Names = {"Plus", "Times", "Divide"} &},
 Information["IAmABanana`*"]
]

enter image description here

We see that the Symbol links returned can be changed by manipulating Names, but we also see that the ordering remains so it is separate from Names functionality. Looking for a Sort operation with TracePrint reveals only one call:

TracePrint[
  Block[{Names = {"Plus", "Times", "Divide"} &}, Information["IAmABanana`*"]];,
  _Sort
]
Sort[{{Plus,System`},{Times,System`},{Divide,System`}},System`Dump`orderfun]

It seems logical that if we can replace System`Dump`orderfun we should control the output order of Information. (Sort is used by other internal functions during the call so we cannot Block it.)

Solution

A robust approach is to create specific ordering rules for the System`Dump`orderfun function as this will allow custom ordering of even partial results.

The implementation is complex enough to justify a function to set the needed definitions:

addSymbolOrdering[context_String, names : {__String}] :=
  With[{pos = PositionIndex[names]},
    PrependTo[DownValues[System`Dump`orderfun],
      HoldPattern[System`Dump`orderfun[{a_, context}, {b_, context}]] :> 
        OrderedQ[pos /@ {a, b}]
    ];
  ]

Example of use:

addSymbolOrdering["foo`", {"one", "two", "three", "four", "five"}]

Context symbols may be defined before or after that use.

foo`one; foo`two; foo`three; foo`four; foo`five; foo`bar;

Note that an additional Symbol, bar, is included here but not in the ordering list. This is to demonstrate that additional (or missing) names do not cause error; they will be placed at the end, though that could be changed if desired.

Example:

?foo`*

enter image description here

You will also find that ?foo`t* or ?foo`f* will produce the correct output, with only the matching names listed and in the correct order.

Additionally because we are setting rules on the ordering function that is used for all calls to Information this order will be used even for mixed results. (For this example make sure that you do not still have the definition from Solution 1 loaded.)

abc`one; abc`two; abc`three; abc`four; (* same names in a different context *)

?@@@`t*

enter image description here

Note that the custom ordering only affects the Symbol names in the specified context; those in abc` are returned in alphabetical order.

| improve this answer | |
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.