As an exercise to gain familiarity with the maple programming platform, I am attempting to repackage a geometric algebra program written for Maple V as a module. I have attached file NewGlyph.mpl containing the initialization code for a module to support the GA routines in the package. The text file was created in the Maple code editor (Maple 2018) and loaded by reading it into a worksheet (configured for maple input instead of 2D math). I have two questions: one: how to get the GAinit procedure to execute completely, and two: to understand the puzzling warnings produced by the code editor. The behaviour I observe when the module is loaded into a worksheet is: NewGlyph:= a maple id. At this point the load=setup procedure has registered type blade, but not executed the remaining procedures in the setup routine. When I execute with(NewGlyph) the exported procedures are displayed properly. However, I still have to execute the GAversion procedure and

the GA_addmetric procedure manually to properly initialize the metric table in the module. It would appear that the module load process permits the execution of the addtype procedure but not the output of the version procedure or the metric table constructor. Is there a way to autoexecute these procedures when the NewGlyph module is invoked by the with(NewGlyph) command? Are there any criteria for the kinds of processes that can be included using option load=setup? My second question concerns the compiler warning raised by the code editor. It warns that "These names were used as global names but were not declared: blade, sig. Also "These local variable were assigned a value but not otherwise used: cleanup.

NewGlyph := module ()

description "Basic Geometric Algebra Functions";

local setup, cleanup;

global e;

export GAversion,GAinit, GAadd_metric,GAmetric,GAmv;

option package, load = setup, unload = cleanup;

setup := proc ()

TypeTools:-AddType(`blade`, proc (a) type(a, indexed) and op(0, a) = 'e' end proc);

GAversion();

GAinit();

end proc;

setup();

cleanup:=proc()

TypeTools:-RemoveType(`blade`);

end proc;

GAinit := proc()

global `&@`, `&.`, `&^`, `&x`, `&s` , `&/`, `&l`, `&v`;

protect('`&@`','`&.`', '`&^`', '`&x`', '`&s`', '`&/`', '`&l`', '`&v`');

GAadd_metric('default', signum, -infinity, infinity);

GAadd_metric('SA', proc () 1 end proc, 1, 3);

GAadd_metric('STA', proc (i) `if`(i = 0, 1, -1) end proc, 0, 3);

GAadd_metric('MSTA', proc (i) `if`(modp(i, 4) = 0, 1, -1) end proc, 0, infinity);

GAadd_metric('Homogeneous', proc () 1 end proc, 0, infinity);

GAadd_metric('Conformal', proc (i) `if`(i = -1, -1, 1) end proc, -1, infinity);

GAmetric('default');

end proc:

GAversion := proc ()

print(`GA Package`);

print(`Version 2.0`);

print(`Written by: Mark Ashdown, maja1@mrao.cam.ac.uk`);

print(`Extended by: Alan Macdonald, macdonal@luther.edu`);

print(`Re-Packaged for Maple 2018 by: Ian McCreath`);

end proc;

GAadd_metric := proc (fred::name, signature::procedure, minind::{integer, infinity}, maxind::{integer, infinity})

global MetricTable;

unprotect('MetricTable');

MetricTable['fred'][sig] := eval(signature);

if maxind < minind then

ERROR(`The minimum index is greater than the maximum index`)

end if;

MetricTable['fred'][min] := minind;

MetricTable['fred'][max] := maxind;

protect('MetricTable');

print(`The GA package knows about metric ` . fred . `.`)

end proc:

GAmetric := proc (a::name)

global Metric, Sig, MetricTable, MinIndex, MaxIndex;

if member([a], [indices(MetricTable)]) then

unprotect('Metric', 'Sig', 'MinIndex', 'MaxIndex');

Metric := a;

Sig := MetricTable[Metric][sig];

MinIndex := MetricTable[Metric][min];

MaxIndex := MetricTable[Metric][max];

protect('Metric', 'Sig', 'MinIndex', 'MaxIndex');

print(`Metric is now set to: ` . Metric)

else

ERROR(`The metric ` . a . ` is unknown to the GA package`)

end if

end proc:

# Creates multivector with name x of with grade or set of grades g with

# indices ind

GAmv := proc(x::name,g::{nonnegint,set(nonnegint)},ind::set(integer))

local i;

if g::set then

add(procname(x,i,ind), i=g)

elif g > nops(ind) then

ERROR(`grade too large for number of indices.`)

elif g=0 then

x[NULL]

else

add(x[op(i)]*e[op(i)], i=combinat:-choose(sort([op(ind)]),g))

end if

end:

end module;

Download NewGlyph.txt