rework symbol table access
This commit is contained in:
parent
832e9851dc
commit
f522963491
14 changed files with 1415 additions and 1796 deletions
|
@ -735,7 +735,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||
if (running)
|
||||
break;
|
||||
goto_calc_mode();
|
||||
printstr("Version 106 - Help is available at eigenmath.com\n");
|
||||
printstr("Version 107 - Help is available at eigenmath.com\n");
|
||||
update_display();
|
||||
break;
|
||||
case ID_MEMORY:
|
||||
|
|
|
@ -940,7 +940,7 @@ emit_symbol(U *p)
|
|||
|
||||
s = get_printname(p);
|
||||
|
||||
if (iskeyword(p)) {
|
||||
if (symbol_index(p) < PI) {
|
||||
emit_str(TIMES_FONT, s);
|
||||
return;
|
||||
}
|
||||
|
|
12
contract.cpp
12
contract.cpp
|
@ -1,7 +1,8 @@
|
|||
// Contract across tensor indices
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "defs.h"
|
||||
|
||||
static void contract_f(void);
|
||||
static void ycontract(void);
|
||||
|
||||
void
|
||||
eval_contract(void)
|
||||
|
@ -24,12 +25,12 @@ void
|
|||
contract(void)
|
||||
{
|
||||
save();
|
||||
contract_f();
|
||||
ycontract();
|
||||
restore();
|
||||
}
|
||||
|
||||
void
|
||||
contract_f(void)
|
||||
ycontract(void)
|
||||
{
|
||||
int h, i, j, k, l, m, n, ndim, nelem;
|
||||
int ai[MAXDIM], an[MAXDIM];
|
||||
|
@ -119,6 +120,9 @@ static char *s[] = {
|
|||
"contract(0)",
|
||||
"0",
|
||||
|
||||
"contract(0.0)",
|
||||
"0",
|
||||
|
||||
"contract(((a,b),(c,d)))",
|
||||
"a+d",
|
||||
|
||||
|
|
22
defs.h
22
defs.h
|
@ -37,7 +37,7 @@ typedef struct U {
|
|||
unsigned char k, tag;
|
||||
} U;
|
||||
|
||||
// the following enum is for struct U member j
|
||||
// the following enum is for struct U, member k
|
||||
|
||||
enum {
|
||||
CONS,
|
||||
|
@ -173,13 +173,19 @@ enum {
|
|||
WEDGE,
|
||||
ZERO,
|
||||
|
||||
NIL, // nil goes here, after standard functions
|
||||
NIL, // nil goes here, after standard functions
|
||||
|
||||
AUTOEXPAND,
|
||||
E,
|
||||
EXPOMODE,
|
||||
IM,
|
||||
LAST,
|
||||
TTY,
|
||||
YYLAST,
|
||||
|
||||
// symbols appearing above are printed in roman type
|
||||
|
||||
// the following symbols are printed in italic type
|
||||
|
||||
PI,
|
||||
SYMBOL_A,
|
||||
SYMBOL_B,
|
||||
|
@ -191,10 +197,8 @@ enum {
|
|||
SYMBOL_X,
|
||||
SYMBOL_Y,
|
||||
SYMBOL_Z,
|
||||
TTY,
|
||||
YYLAST,
|
||||
|
||||
USER_SYMBOLS, // this must be last
|
||||
USR_SYMBOLS, // this must be last
|
||||
};
|
||||
|
||||
#define TOS 1000000
|
||||
|
@ -238,10 +242,8 @@ extern U **frame;
|
|||
#define isnum(p) (isrational(p) || isdouble(p))
|
||||
#define isstr(p) ((p)->k == STR)
|
||||
#define istensor(p) ((p)->k == TENSOR)
|
||||
#define isscalar(p) ((p)->k != TENSOR)
|
||||
#define issymbol(p) ((p)->k == SYM)
|
||||
#define iskeyword(p) (issymbol(p) && symbol_index(p) <= NIL)
|
||||
#define isusersym(p) (issymbol(p) && symbol_index(p) > NIL)
|
||||
#define iskeyword(p) (issymbol(p) && symbol_index(p) < NIL)
|
||||
|
||||
#define car(p) (iscons(p) ? (p)->u.cons.car : nil)
|
||||
#define cdr(p) (iscons(p) ? (p)->u.cons.cdr : nil)
|
||||
|
@ -509,7 +511,6 @@ void init_stack(void);
|
|||
void push_zero_matrix(int, int);
|
||||
void push_identity_matrix(int);
|
||||
void push_symbol(int);
|
||||
U *get_symbol(char *);
|
||||
char *get_printname(U *);
|
||||
U *symbol(int);
|
||||
void power(void);
|
||||
|
@ -665,5 +666,6 @@ extern void tchebychevT(void);
|
|||
extern void tchebychevU(void);
|
||||
extern double erfc(double);
|
||||
extern void std_symbol(char *, int);
|
||||
extern U *usr_symbol(char *);
|
||||
extern int symbol_index(U *);
|
||||
extern int iscomplexnumber(U *);
|
||||
|
|
6
draw.cpp
6
draw.cpp
|
@ -322,7 +322,7 @@ setup_trange_f(void)
|
|||
|
||||
tmax = M_PI;
|
||||
|
||||
p1 = get_symbol("trange");
|
||||
p1 = usr_symbol("trange");
|
||||
|
||||
if (!issymbol(p1))
|
||||
return;
|
||||
|
@ -376,7 +376,7 @@ setup_xrange_f(void)
|
|||
|
||||
xmax = 10.0;
|
||||
|
||||
p1 = get_symbol("xrange");
|
||||
p1 = usr_symbol("xrange");
|
||||
|
||||
if (!issymbol(p1))
|
||||
return;
|
||||
|
@ -458,7 +458,7 @@ setup_yrange_f(void)
|
|||
|
||||
ymax = 10.0;
|
||||
|
||||
p1 = get_symbol("yrange");
|
||||
p1 = usr_symbol("yrange");
|
||||
|
||||
if (!issymbol(p1))
|
||||
return;
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
#include "stdafx.h"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// Compute eigenvalues and eigenvectors
|
||||
|
@ -34,6 +32,7 @@
|
|||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "defs.h"
|
||||
|
||||
#define D(i, j) dd[n * (i) + (j)]
|
||||
|
@ -55,12 +54,12 @@ eval_eigen(void)
|
|||
|
||||
eigen(EIGEN);
|
||||
|
||||
p1 = get_symbol("D");
|
||||
p1 = usr_symbol("D");
|
||||
|
||||
p1->u.sym.binding = p2;
|
||||
p1->u.sym.binding2 = nil;
|
||||
|
||||
p1 = get_symbol("Q");
|
||||
p1 = usr_symbol("Q");
|
||||
|
||||
p1->u.sym.binding = p3;
|
||||
p1->u.sym.binding2 = nil;
|
||||
|
|
223
eval.cpp
223
eval.cpp
|
@ -60,16 +60,21 @@ extern void eval_tan(void);
|
|||
extern void eval_tanh(void);
|
||||
extern void eval_tchebychevT(void);
|
||||
extern void eval_tchebychevU(void);
|
||||
extern void eval_test(void);
|
||||
extern void eval_testeq(void);
|
||||
extern void eval_testge(void);
|
||||
extern void eval_testgt(void);
|
||||
extern void eval_testle(void);
|
||||
extern void eval_testlt(void);
|
||||
extern void eval_trace(void);
|
||||
extern void eval_transpose(void);
|
||||
extern void eval_user_function(void);
|
||||
extern void eval_writefile(void);
|
||||
extern void eval_zero(void);
|
||||
|
||||
extern void define_user_function(void);
|
||||
|
||||
int expomode;
|
||||
int trigmode;
|
||||
static char errstr[24];
|
||||
|
||||
void
|
||||
setup(void)
|
||||
|
@ -738,113 +743,6 @@ eval_taylor(void)
|
|||
taylor();
|
||||
}
|
||||
|
||||
static void
|
||||
eval_test(void)
|
||||
{
|
||||
p2 = cdr(p1);
|
||||
while (iscons(p2)) {
|
||||
push(car(p2));
|
||||
eval();
|
||||
p3 = pop();
|
||||
if (isnum(p3) && !iszero(p3)) {
|
||||
push(cadr(p2));
|
||||
eval();
|
||||
return;
|
||||
}
|
||||
p2 = cddr(p2);
|
||||
}
|
||||
push(p1);
|
||||
}
|
||||
|
||||
static void
|
||||
eval_testeq(void)
|
||||
{
|
||||
push(cadr(p1));
|
||||
eval();
|
||||
push(caddr(p1));
|
||||
eval();
|
||||
p2 = pop();
|
||||
p1 = pop();
|
||||
if (equal(p1, p2))
|
||||
push(one);
|
||||
else
|
||||
push(zero);
|
||||
}
|
||||
|
||||
static void
|
||||
eval_testge(void)
|
||||
{
|
||||
push(cadr(p1));
|
||||
eval();
|
||||
push(caddr(p1));
|
||||
eval();
|
||||
subtract();
|
||||
p2 = pop();
|
||||
if (isnum(p2))
|
||||
if (isnegativenumber(p2))
|
||||
push(zero);
|
||||
else
|
||||
push(one);
|
||||
else
|
||||
push(p1);
|
||||
}
|
||||
|
||||
static void
|
||||
eval_testgt(void)
|
||||
{
|
||||
push(cadr(p1));
|
||||
eval();
|
||||
push(caddr(p1));
|
||||
eval();
|
||||
swap();
|
||||
subtract();
|
||||
p2 = pop();
|
||||
if (isnum(p2))
|
||||
if (isnegativenumber(p2))
|
||||
push(one);
|
||||
else
|
||||
push(zero);
|
||||
else
|
||||
push(p1);
|
||||
}
|
||||
|
||||
static void
|
||||
eval_testle(void)
|
||||
{
|
||||
push(cadr(p1));
|
||||
eval();
|
||||
push(caddr(p1));
|
||||
eval();
|
||||
swap();
|
||||
subtract();
|
||||
p2 = pop();
|
||||
if (isnum(p2))
|
||||
if (isnegativenumber(p2))
|
||||
push(zero);
|
||||
else
|
||||
push(one);
|
||||
else
|
||||
push(p1);
|
||||
}
|
||||
|
||||
static void
|
||||
eval_testlt(void)
|
||||
{
|
||||
push(cadr(p1));
|
||||
eval();
|
||||
push(caddr(p1));
|
||||
eval();
|
||||
subtract();
|
||||
p2 = pop();
|
||||
if (isnum(p2))
|
||||
if (isnegativenumber(p2))
|
||||
push(one);
|
||||
else
|
||||
push(zero);
|
||||
else
|
||||
push(p1);
|
||||
}
|
||||
|
||||
static void
|
||||
eval_unit(void)
|
||||
{
|
||||
|
@ -865,37 +763,6 @@ eval_unit(void)
|
|||
push(p1);
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
||||
static void eval_zero(void);
|
||||
|
||||
static void
|
||||
eval_unit(void)
|
||||
{
|
||||
int i, j, k;
|
||||
eval_zero();
|
||||
p1 = pop();
|
||||
if (p1->k != TENSOR || p1->u.tensor->ndim < 2) {
|
||||
push(p1);
|
||||
return;
|
||||
}
|
||||
for (i = 0; i < p1->u.tensor->dim[0]; i++) {
|
||||
k = 0;
|
||||
for (j = 0; j < p1->u.tensor->ndim; j++) {
|
||||
if (i >= p1->u.tensor->dim[j]) {
|
||||
k = -1;
|
||||
break;
|
||||
}
|
||||
k = k * p1->u.tensor->dim[j] + i;
|
||||
}
|
||||
if (k >= 0)
|
||||
p1->u.tensor->elem[k] = one;
|
||||
}
|
||||
push(p1);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static void
|
||||
eval_wedge(void)
|
||||
{
|
||||
|
@ -916,7 +783,6 @@ static void eval_cons(void);
|
|||
void
|
||||
eval(void)
|
||||
{
|
||||
static char s[24];
|
||||
save();
|
||||
p1 = pop();
|
||||
switch (p1->k) {
|
||||
|
@ -956,8 +822,8 @@ eval(void)
|
|||
push(p1->u.sym.binding);
|
||||
break;
|
||||
default:
|
||||
sprintf(s, "atom %d?", p1->k);
|
||||
stop(s);
|
||||
sprintf(errstr, "atom %d?", p1->k);
|
||||
stop(errstr);
|
||||
break;
|
||||
}
|
||||
if (stack[tos - 1] != nil)
|
||||
|
@ -968,10 +834,9 @@ eval(void)
|
|||
static void
|
||||
eval_cons(void)
|
||||
{
|
||||
static char s[24];
|
||||
if (!issymbol(car(p1))) {
|
||||
sprintf(s, "form %d?", car(p1)->k);
|
||||
stop(s);
|
||||
sprintf(errstr, "form %d?", car(p1)->k);
|
||||
stop(errstr);
|
||||
}
|
||||
switch (symbol_index(car(p1))) {
|
||||
case ABS: eval_abs(); break;
|
||||
|
@ -1105,72 +970,6 @@ eval_noexpand(void)
|
|||
expanding = x;
|
||||
}
|
||||
|
||||
static char *s[] = {
|
||||
|
||||
"1==1",
|
||||
"1",
|
||||
|
||||
"1==2",
|
||||
"0",
|
||||
|
||||
"a==b",
|
||||
"testeq(a,b)",
|
||||
|
||||
"1>=1",
|
||||
"1",
|
||||
|
||||
"1>=2",
|
||||
"0",
|
||||
|
||||
"2>=1",
|
||||
"1",
|
||||
|
||||
"a>=b",
|
||||
"testge(a,b)",
|
||||
|
||||
"1>1",
|
||||
"0",
|
||||
|
||||
"1>2",
|
||||
"0",
|
||||
|
||||
"2>1",
|
||||
"1",
|
||||
|
||||
"a>b",
|
||||
"testgt(a,b)",
|
||||
|
||||
"1<=1",
|
||||
"1",
|
||||
|
||||
"1<=2",
|
||||
"1",
|
||||
|
||||
"2<=1",
|
||||
"0",
|
||||
|
||||
"a<=b",
|
||||
"testle(a,b)",
|
||||
|
||||
"1<1",
|
||||
"0",
|
||||
|
||||
"1<2",
|
||||
"1",
|
||||
|
||||
"2<1",
|
||||
"0",
|
||||
|
||||
"a<b",
|
||||
"testlt(a,b)",
|
||||
};
|
||||
|
||||
void
|
||||
test_test(void)
|
||||
{
|
||||
test(__FILE__, s, sizeof s / sizeof (char *));
|
||||
}
|
||||
|
||||
extern void filter(void);
|
||||
static void filter_f(void);
|
||||
static void filter_sum(void);
|
||||
|
|
35
init.cpp
35
init.cpp
|
@ -8,9 +8,9 @@ void
|
|||
init(void)
|
||||
{
|
||||
if (nil)
|
||||
return; // already initted
|
||||
return; // already initted
|
||||
|
||||
nsym = USER_SYMBOLS;
|
||||
nsym = USR_SYMBOLS;
|
||||
|
||||
nil = symtab + NIL;
|
||||
|
||||
|
@ -154,9 +154,10 @@ init(void)
|
|||
std_symbol("autoexpand", AUTOEXPAND);
|
||||
std_symbol("~exp", E); // tilde so sort puts it after scalar symbols
|
||||
std_symbol("expomode", EXPOMODE);
|
||||
std_symbol("tty", TTY);
|
||||
std_symbol("*im", IM);
|
||||
std_symbol("last", LAST);
|
||||
std_symbol("tty", TTY);
|
||||
std_symbol("", YYLAST);
|
||||
|
||||
std_symbol("pi", PI);
|
||||
|
||||
std_symbol("a", SYMBOL_A);
|
||||
|
@ -170,22 +171,20 @@ init(void)
|
|||
std_symbol("y", SYMBOL_Y);
|
||||
std_symbol("z", SYMBOL_Z);
|
||||
|
||||
std_symbol("$last", YYLAST);
|
||||
meta_a = usr_symbol("$a");
|
||||
meta_b = usr_symbol("$b");
|
||||
meta_c = usr_symbol("$c");
|
||||
meta_n = usr_symbol("$n");
|
||||
meta_x = usr_symbol("$x");
|
||||
|
||||
meta_a = get_symbol("$a");
|
||||
meta_b = get_symbol("$b");
|
||||
meta_c = get_symbol("$c");
|
||||
meta_n = get_symbol("$n");
|
||||
meta_x = get_symbol("$x");
|
||||
tmp = usr_symbol("$tmp");
|
||||
|
||||
tmp = get_symbol("$tmp");
|
||||
|
||||
formal_arg[0] = get_symbol("$1");
|
||||
formal_arg[1] = get_symbol("$2");
|
||||
formal_arg[2] = get_symbol("$3");
|
||||
formal_arg[3] = get_symbol("$4");
|
||||
formal_arg[4] = get_symbol("$5");
|
||||
formal_arg[5] = get_symbol("$6");
|
||||
formal_arg[0] = usr_symbol("$1");
|
||||
formal_arg[1] = usr_symbol("$2");
|
||||
formal_arg[2] = usr_symbol("$3");
|
||||
formal_arg[3] = usr_symbol("$4");
|
||||
formal_arg[4] = usr_symbol("$5");
|
||||
formal_arg[5] = usr_symbol("$6");
|
||||
|
||||
// if anything is added here be sure it gets untagged in gc()
|
||||
|
||||
|
|
8
run.cpp
8
run.cpp
|
@ -86,7 +86,7 @@ run(char *s)
|
|||
|
||||
// don't print nil unless it was due to eval of a symbol
|
||||
|
||||
if (p2 == nil && !isusersym(p1))
|
||||
if (p2 == nil && (iskeyword(p1) || !issymbol(p1)))
|
||||
continue;
|
||||
|
||||
if (equal(symbol(TTY)->u.sym.binding, one) || test_flag) // tty mode?
|
||||
|
@ -95,10 +95,8 @@ run(char *s)
|
|||
#ifdef LINUX
|
||||
display(p2);
|
||||
#else
|
||||
if (isusersym(p1)
|
||||
&& p1 != symbol(LAST)
|
||||
&& p1 != symbol(TTY)
|
||||
&& p1 != p2) {
|
||||
if (issymbol(p1) && !iskeyword(p1) && p1 != p2) {
|
||||
// print as a = b
|
||||
push_symbol(SETQ);
|
||||
push(p1);
|
||||
push(p2);
|
||||
|
|
4
scan.cpp
4
scan.cpp
|
@ -295,7 +295,7 @@ scan_symbol(void)
|
|||
{
|
||||
if (token != T_SYMBOL)
|
||||
error("symbol expected");
|
||||
push(get_symbol(token_buf));
|
||||
push(usr_symbol(token_buf));
|
||||
get_next_token();
|
||||
}
|
||||
|
||||
|
@ -311,7 +311,7 @@ scan_function_call(void)
|
|||
{
|
||||
int n = 1;
|
||||
U *p;
|
||||
p = get_symbol(token_buf);
|
||||
p = usr_symbol(token_buf);
|
||||
if (p == symbol(SYMBOL_D))
|
||||
push_symbol(DERIVATIVE);
|
||||
else
|
||||
|
|
1191
selftest.cpp
1191
selftest.cpp
File diff suppressed because it is too large
Load diff
24
symbol.cpp
24
symbol.cpp
|
@ -7,8 +7,19 @@ U symtab[YMAX];
|
|||
char *printname[YMAX];
|
||||
int nsym; // number of symbols in table;
|
||||
|
||||
void
|
||||
std_symbol(char *s, int n)
|
||||
{
|
||||
U *p;
|
||||
p = symtab + n;
|
||||
p->k = SYM;
|
||||
p->u.sym.binding = p;
|
||||
p->u.sym.binding2 = nil;
|
||||
printname[n] = strdup(s);
|
||||
}
|
||||
|
||||
U *
|
||||
get_symbol(char *s)
|
||||
usr_symbol(char *s)
|
||||
{
|
||||
int i;
|
||||
U *p;
|
||||
|
@ -26,17 +37,6 @@ get_symbol(char *s)
|
|||
return p;
|
||||
}
|
||||
|
||||
void
|
||||
std_symbol(char *s, int n)
|
||||
{
|
||||
U *p;
|
||||
p = symtab + n;
|
||||
p->k = SYM;
|
||||
p->u.sym.binding = p;
|
||||
p->u.sym.binding2 = nil;
|
||||
printname[n] = strdup(s);
|
||||
}
|
||||
|
||||
char *
|
||||
get_printname(U *p)
|
||||
{
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
// Transpose tensor indices
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "defs.h"
|
||||
|
||||
static void transpose_f(void);
|
||||
static void ytranspose(void);
|
||||
|
||||
void
|
||||
eval_transpose(void)
|
||||
|
@ -24,12 +25,12 @@ void
|
|||
transpose(void)
|
||||
{
|
||||
save();
|
||||
transpose_f();
|
||||
ytranspose();
|
||||
restore();
|
||||
}
|
||||
|
||||
static void
|
||||
transpose_f(void)
|
||||
ytranspose(void)
|
||||
{
|
||||
int i, j, k, l, m, ndim, nelem, t;
|
||||
int ai[MAXDIM], an[MAXDIM];
|
||||
|
@ -111,6 +112,9 @@ static char *s[] = {
|
|||
"transpose(0)",
|
||||
"0",
|
||||
|
||||
"transpose(0.0)",
|
||||
"0",
|
||||
|
||||
"transpose(((a,b),(c,d)))",
|
||||
"((a,c),(b,d))",
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue