rework symbol table access

This commit is contained in:
George Weigt 2005-08-07 07:42:42 -07:00
parent 832e9851dc
commit f522963491
14 changed files with 1415 additions and 1796 deletions

View file

@ -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:

View file

@ -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;
}

View file

@ -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
View file

@ -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 *);

View file

@ -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;

View file

@ -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
View file

@ -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);

View file

@ -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()

View file

@ -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);

View file

@ -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

File diff suppressed because it is too large Load diff

View file

@ -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)
{

1663
test.cpp

File diff suppressed because it is too large Load diff

View file

@ -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))",