static_init 2.08 KB
giac use several global variables that must be initialized in a very
specific order:
- the global var of input_lexer.ll must be loaded first because
they contain tables to auto-registering functions of all other modules
- then the global var of gen.cc
- the global var of identificateur.cc must be loaded before the
global var of usual.cc
- the global var of symbolic.cc should be loaded last
FIXME: all unary_function_ptr tables should be replace by
unary_function_ptr * tables.
Under linux and win32 gcc, it seems the loader make static
initializations in object file in reversed order, therefore linking
must be done finishing with usual.o identificateur.o and input_lexer.o
Under MacOSX gcc, the converse rule should be applied.

List of global variables in modules (function not included)
input_lexer.o: syms, lexer_functions, lexer_function_registered
gen.o: zero, minus_one, plus_one, plus_two, plus_three, cst_i
identificateur.o and or usual.o: cst_pi, cst_two_pi, 1/2, ..., 
tables of unary_function_ptr

**********
Modifs a faire:
linalg[ker] ou linalg::ker qui doit se traduire en linalg[ker]
linalg doit etre declare comme unary_op
si f est un unary_function_ptr, 
f[qqchose](x) doit renvoyer f([qqchose,x]) avec un vecteur de subtype
special. Pour les fonctions comme linalg, on utilise la meme fonction
giac qui forme la chaine "f[qqchose]", cherche dans la table du lexer
la fonction correspondante et l'appelle sur x.
Donc with(linalg) ou export(linalg)
rajoute les fonctions renvoyees par linalg() dans la liste reconnue
par le lexer de la maniere suivante
il doit y avoir une premiere table nom de commande tapé
-> nom de commande interprete par le lexer -> puis traduction 
Par exemple, si on fait with(linalg), la 1ere table contient
"ker" -> "linalg[ker]"
alors que la fonction ker est renommee "linalg[ker]"
On peut aussi ajouter et enlever des fonctions de la 1ere table
avec register et unregister.
Protect et unprotect: on cree un vecteur string unprotected, si le nom
lexe appartient a ce vecteur alors le teste d'appartenance a la 1ere
table n'est pas effectue (le nom devient donc un nom de variable)