Format[ ] with \[OverBracket] in a package `Private` context
- To: mathgroup at smc.vnet.net
- Subject: [mg56431] Format[ ] with \[OverBracket] in a package `Private` context
- From: "Trevor Baca" <trevorbaca at gmail.com>
- Date: Mon, 25 Apr 2005 01:30:45 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
hello mathgroup, my goal is to format foo[_List] objects with an overscripted \[OverBracket], and then shove this bit of code into a package for later access. this does the trick in a notebook session: Format[foo[l_List]] := Overscript[RowBox[l], \[OverBracket]] // DisplayForm; the interpreter now outputs foo[{2,3,4,5}] as 1 2 3 4 with a lovely overbracket stretching across the top. so far so good. now the hard part: shoving this bit of code into a package without context issues getting in the way. (three example packages follow; feel free to skip to the section marked "CONCLUSION" at the bottom for the actual question.) ==== PROBLEM PACKAGE ================= BeginPackage["Foo`"] foo::usage="foo objects print with overbracket."; Begin["`Private`"] Format[foo[e_]]:=Overscript[RowBox[e],\[OverBracket]]//DisplayForm End[] EndPackage[] ==== end problem package ================ with the problem package, i interpret the following three commands: Quit[ ] (* to clear out any previous definitions in any contexts *) << Foo` foo[{2,3,4,5}] ... and, unfotunately, foo[{2,3,4,5}] prints as 2 3 4 5 with the ugly label Foo`Private`\[OverBracket] running across the top. not at all what i wanted. first solution: ==== SOLUTION PACKAGE 1: use System` context ========== BeginPackage["Foo`"] foo::usage="foo objects print with overbracket."; Begin["`Private`"] Begin["System`"] \[OverBracket] End[] Format[foo[e_]]:=Overscript[RowBox[e],\[OverBracket]]//DisplayForm End[] EndPackage[] ==== end solution package 1 ======================= with solution package 1, i again interpret the following three commands: Quit[ ] (* to clear out any previous definitions in any contexts *) << Foo` foo[{2,3,4,5}] ... and this works: foo[{2,3,4,5}] now prints as 2 3 4 5 with the overbracket running across the top, as desired. but i've introduced the OverBracket symbol into the System` context directly; and is this a generally bad practice? fearing that it might be, i build this second solution: ==== SOLUTION PACKAGE 2: use Foo` context ========== BeginPackage["Foo`"] foo::usage="foo objects print with overbracket."; \[OverBracket] Begin["`Private`"] Format[foo[e_]]:=Overscript[RowBox[e],\[OverBracket]]//DisplayForm End[] EndPackage[] ==== end solution package 2 ===================== with solution package 2, i interpret the following three commands one last time: Quit[ ] (* to clear out any previous definitions in any contexts *) << Foo` foo[{2,3,4,5}] ... and this, too, works fine: foo[{2,3,4,5}] prints as 2 3 4 5 with the requested overbracket. unfortunately, the OverBracket symbol now lives in Foo`\[OverBracket], which somehow seems wrong to me, and further seems to violate the spirit of the purpose of the public section of a package ... introduce symbols "for export". CONCLUSION: so is it better to stick the OverBracket symbol into the System` context (as in solution package 1), or to stick the OverBracket symbol into the Foo` context (as in solution package 2), or to do something else entirely? (i strongly prefer solution 1 (using the System` context) because it seems bizarre to me that the OverBracket symbol doesn't already exist in the System` context, so why not remedy the situation? on the other hand, i could be convinced that messing with the System` context is as bad an idea as messing with most reserved namespaces, hence solution 2. but what i don't like about solution 2 is that after loading the package, Names["Foo`*"] will give you both "foo" (which is good) and "\[OverBracket]" (which just seems wrong)). anything to help make the decision or clean this up? trevor.