GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
########################################################################### ## #W special.g The SCSCP package Alexander Konovalov #W Steve Linton ## ########################################################################### ########################################################################### # # GetAllowedHeads( server, port ) # InstallGlobalFunction( GetAllowedHeads, function( server, port ) local r, i, res; r := EvaluateBySCSCP( "get_allowed_heads", [ ], server, port : output:="tree" ).object; r := First( r.content, s -> s.name="OMA"); r := First( r.content, s -> s.name="OMA"); r := Filtered( r.content, OMIsNotDummyLeaf ); if r[1].attributes.name = "symbol_set" then res := rec(); for i in [ 2.. Length(r) ] do if not IsBound( r[i].attributes.cd ) then # case of <OMA><OMS name="CDName" cd="meta"/><OMSTR>cdname</OMSTR></OMA> if IsBound(r[i].content) and Length(r[i].content)=2 then if r[i].content[1].attributes = rec( cd := "meta", name := "CDName" ) then res.(r[i].content[2].content[1].content) := true; else Error( "Can not parse OpenMath object (expecting meta.CDName)\n" ); fi; else Error( "Can not parse OpenMath object! (expecting OMA with two children)\n" ); fi; else if not IsBound( res.(r[i].attributes.cd ) )then res.( r[i].attributes.cd ) := []; fi; AddSet( res.( r[i].attributes.cd ), r[i].attributes.name ); fi; od; return res; else Error( "Can not parse OpenMath object (expecting symbol_set)\n" ); fi; end); ########################################################################### # # GetServiceDescription( server, port ) # InstallGlobalFunction( GetServiceDescription, function( server, port ) local r; r := EvaluateBySCSCP( "get_service_description", [ ], server, port : output:="tree" ).object; r := First( r.content, s -> s.name="OMA"); r := First( r.content, s -> s.name="OMA"); r := Filtered( r.content, OMIsNotDummyLeaf ); if r[1].attributes.name = "service_description" then return rec( service_name := r[2].content[1].content, version := r[3].content[1].content, description := r[4].content[1].content ); else Error( "Can not parse OpenMath object! \n" ); fi; end); ########################################################################### # # GetSignature( cd, name, server, port ) # InstallGlobalFunction( GetSignature, function( cd, name, server, port ) local r, ra, re; r := EvaluateBySCSCP( "get_signature", [ OMPlainString( Concatenation( "<OMS cd=\"", cd, "\" name=\"", name, "\"/>") ) ], server, port : return_tree ).object; r := First( r.content, s -> s.name="OMA"); ra := First( r.content, s -> s.name="OMA"); if ra = fail then re := First( r.content, s -> s.name="OME"); r := Filtered( re.content, OMIsNotDummyLeaf ); if r[1].attributes.name = "error_system_specific" then Error( r[2].content[1].content ); else Error( "Can not parse OpenMath object! \n" ); fi; else r := Filtered( ra.content, OMIsNotDummyLeaf ); if r[1].attributes.name = "signature" then return rec( symbol := r[2].attributes, minarg := OMParseXmlObj( r[3] ), maxarg := OMParseXmlObj( r[4] ), symbolargs := r[5].attributes ); else Error( "Can not parse OpenMath object! \n" ); fi; fi; end); ########################################################################### # # GetTransientCD( cdname, server, port ) # InstallGlobalFunction( GetTransientCD, function( cdname, server, port ) local r, rcd, re, i, j, res, t, defs, d; r := EvaluateBySCSCP( "get_transient_cd", [ OMPlainString( Concatenation( "<OMA><OMS name=\"CDName\" cd=\"meta\"/><OMSTR>", cdname, "</OMSTR></OMA>" ) ) ], server, port : return_tree ).object; r := First( r.content, s -> s.name="OMA"); rcd := First( r.content, s -> s.name="CD"); if rcd = fail then re := First( r.content, s -> s.name="OME"); r := Filtered( re.content, OMIsNotDummyLeaf ); if r[1].attributes.name = "error_system_specific" then Error( r[2].content[1].content ); else Error( "Can not parse OpenMath object! \n" ); fi; else r := Filtered( rcd.content, OMIsNotDummyLeaf ); if r[1].name = "CDName" then res := rec(); defs := []; for i in [ 1 .. Length(r) ] do if r[i].name = "CDDefinition" then t := Filtered( r[i].content, OMIsNotDummyLeaf ); d := rec(); for j in [ 1 .. Length(t) ] do if t[j].name = "Name" then d.Name := t[j].content[1].content; elif t[j].name = "Description" then d.Description := t[j].content[1].content; else Error("unhandled element in ", t[j], "\n" ); fi; od; Add( defs, d ); elif r[i].name = "CDName" then res.CDName := r[i].content[1].content; elif r[i].name = "CDReviewDate" then res.CDReviewDate := r[i].content[1].content; elif r[i].name = "CDDate" then res.CDDate := r[i].content[1].content; elif r[i].name = "CDVersion" then res.CDVersion := r[i].content[1].content; elif r[i].name = "CDRevision" then res.CDRevision := r[i].content[1].content; elif r[i].name = "CDStatus" then res.CDStatus := r[i].content[1].content; elif r[i].name = "Description" then res.Description := r[i].content[1].content; else Error("unhandled element in the retrieved content dictionary ", cdname, "\n" ); fi; od; res.CDDefinitions := defs; return res; else Error( "Can not parse OpenMath object! \n" ); fi; fi; end); ########################################################################### # # IsAllowedHead( cd, name, server, port ) # InstallGlobalFunction( IsAllowedHead, function( cd, name, server, port ) return EvaluateBySCSCP( "is_allowed_head", [ OMPlainString( Concatenation( "<OMS cd=\"", cd, "\" name=\"", name, "\"/>") ) ], server, port ).object; end); ########################################################################### ## #E ##