home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / e / e031 / 3.ddi / MATHZIP2 / STARTUP / INSTALL.M < prev    next >
Encoding:
Text File  |  1991-09-23  |  3.2 KB  |  109 lines

  1.  
  2. Begin["System`"]
  3.  
  4. Install::usage = "Install[\"command\"] starts an external program and
  5. installs Mathematica definitions to call functions in it."
  6.  
  7. Reinstall::usage = "Reinstall[link] un-installs the specified external
  8. package and installs it again."
  9.  
  10. Uninstall::usage = "Uninstall[link] terminates an external program started
  11. by Install, and removes Mathematica definitions set up by it."
  12.  
  13. ThisLink::usage = "ThisLink is used in patterns for external packages
  14. to distinguish between several instances of the same package."
  15.  
  16. LinkPatterns::usage = "LinkPatterns[link] gives the list of patterns
  17. defined in the external package which is accessed via the specified link."
  18.  
  19.     
  20. ExternalCall DefineExternal CallPacket ReturnPacket EvaluatePacket
  21.  
  22. Begin["`Private`"]
  23.  
  24. Install[comm_String] := Block[ {ThisLink}, 
  25.     ThisLink = LinkOpen[comm]; 
  26.     ThisLink = ConnectToExternalPackage[ThisLink];
  27.     defineLinkObject[First[ThisLink], ThisLink];
  28.     ThisLink
  29.     ]
  30.  
  31. Install[link_LinkObject] := Block[ {ThisLink = link}, 
  32.     ThisLink = ConnectToExternalPackage[ThisLink];
  33.     defineLinkObject[First[ThisLink], ThisLink];
  34.     ThisLink
  35.     ]
  36.  
  37. ConnectToExternalPackage[link_LinkObject] :=
  38.     Block[{ e, defined = {}}, 
  39.           While[
  40.             (e = LinkRead[link]) =!= End && e =!= $Failed, 
  41.              If[ StringQ[e], ToExpression[e]]
  42.         ];
  43.         SetDelayed @@ { LinkPatterns[link], defined};
  44.         link
  45.     ] 
  46.  
  47. ConnectToExternalPackage[_] := $Failed
  48.  
  49. defineLinkObject[s_String, link_LinkObject] := ( 
  50.     If[  Length[LinkObject[s]] != 1,
  51.         LinkObject[s]=.
  52.     ];
  53.     LinkObject[s] = link
  54.     )
  55.  
  56. defineLinkObject[__] = $Failed
  57.           
  58. DefineExternal[p_String, a_, n_] := Module[ {e},
  59.     e = Hold[_ :=  ExternalCall[ _, CallPacket[_, _]]] ;
  60.     e = ReplaceHeldPart[ e, ToHeldExpression[p], {1,1}];
  61.     e = ReplacePart    [ e, ThisLink, {1,2,1}];
  62.     e = ReplacePart    [ e, n, {1,2,2,1}];
  63.     e = ReplaceHeldPart[ e, ToHeldExpression[a], {1,2,2,2}];
  64.     ReleaseHold[e];
  65.     defined = Append[defined, HoldForm @@ ToHeldExpression[p]]
  66.     ]
  67.  
  68.  
  69. ExternalCall[ link_LinkObject, packet_CallPacket] := 
  70.     If [LinkWrite[link, packet] =!= $Failed, 
  71.         ExternalAnswer[link, LinkRead[link]]
  72.     ]
  73.     (* Initial call - the link will answer either with 
  74.         ReturnPacket (final result), or with  EvaluatePacket *)
  75.         
  76. ExternalAnswer[ link_LinkObject, EvaluatePacket[expr_]] := 
  77.     If [LinkWrite[link, ReturnPacket[expr]] =!= $Failed, 
  78.         ExternalAnswer[ link, LinkRead[link]]
  79.     ]
  80.     (* having sent a ReturnPacket we get to the same state as after
  81.        the initial CallPacket. *)
  82.  
  83. ExternalAnswer[ link_LinkObject, ReturnPacket[result_]] := result
  84.  
  85. ExternalAnswer[ link_LinkObject, result_] := result
  86.  
  87. Uninstall[link_LinkObject] := ( LinkClose[link];
  88.     LinkPatterns[link] //. HoldForm -> Unset;
  89.     unset[linkPatterns[link]] //. {unset->Unset, linkPatterns -> LinkPatterns};
  90.     First[link]
  91.     )
  92.  
  93. Uninstall::unlink = "External package `1` has not been installed."
  94.  
  95. Uninstall[comm_String] := Module[{link = LinkObject[comm]},
  96.     If[ Length[link] > 1,
  97.         Uninstall[link]; ReleaseHold[Hold[LinkObject[x]=.]/. x :> comm]; comm,
  98.         Message[Uninstall::unlink, comm]
  99.     ] ]
  100.  
  101. Reinstall[l_] := Module[ {name = Uninstall[l]},
  102.     If [StringQ[name], Install[name]]
  103.     ]
  104.  
  105. End[]
  106.  
  107. End[]
  108.  
  109.