using Orestis Vantzos OOP package
- To: mathgroup at smc.vnet.net
- Subject: [mg76872] using Orestis Vantzos OOP package
- From: Hannes Kessler <HannesKessler at hushmail.com>
- Date: Tue, 29 May 2007 04:54:48 -0400 (EDT)
Hello, my question is related to difficulties to use Orestis Vantzos OOP package (http://library.wolfram.com/infocenter/Conferences/5773/) in other package files. The following is from the OOP package MakeExpression[RowBox[{RowBox[{obj_, "::", msg_}], "[", args___, "]"}], StandardForm] := MakeExpression[RowBox[{obj, "[", RowBox[{"\"" <> msg <> "\"", "[", args, "]"}], "]"}], StandardForm] It gives the following interpretation rule for expressions typed in a notebook obj::msg[args] -> obj["msg"[args]] and allows you to write definitions similar to obj::msg[args] = 1 I saved the OOP package in a file OOP.m and loaded it with Needs["OOP`"]. The first problem was the following complaint by Mathematica SetDelayed::"write" : "Tag MessageName in super::"path"[] is Protected." resulting from the following line the OOP package super::path[] := $superPath; The complaint disappears after changing changing this line to super["path"[]] := $superPath; in agreement with the intended interpretation. Loading the package and using it in a notebook works, writing in class definitions expressions as for example volume[] := (4*Pi*self::radius[]^3)/3; However, using class definitions in package files causes problems. Here is Vantzos Sphere-example written to TestSphere.m BeginPackage["TestSphere`", {"OOP`"}]; BeginClass["Sphere`"]; volume[] := 4/3 Pi (self::radius[])^3; translateBy[\[CapitalDelta]x_] := (self::center[] += \ [CapitalDelta]x); EndClass[]; EndPackage[]; Loading the package to a notebook and using it leads to errors Needs["TestSphere`"]; s1<=={"Sphere`", "Object`"}; s1::radius[] = 1; s1::volume[] --> 4/3 Pi self::"radius"[]^3 instead of the expected 4/3 Pi s1::center[] = {1, 0, 0}; s1::translate[{2,0,0}] --> Error message AddTo::"rvalue" : "self::"center"[] is not a variable with a value, so its value cannot be changed." instead of the expected {3,0,0} I suspected the above MakeExpression interpretation rule for boxes does not function in plain text package files. But attempting Unprotect[MessageName]; MessageName[a_Symbol, b_String][args___] := a[b[args]] Protect[MessageName]; does not help either as it generates the error Message::"name" : "Message name a_Symbol::b_String is not of the form symbol::name or symbol::name::language." Any suggestions how to use the OOP package in other package files? Thanks in advance. Hannes Kessler