Got results-as-operands working
This commit is contained in:
parent
17b6bf12b4
commit
9ab907d014
|
@ -3,7 +3,7 @@
|
||||||
"capabilities": [
|
"capabilities": [
|
||||||
""
|
""
|
||||||
],
|
],
|
||||||
"companyName": "Save V.",
|
"companyName": "Sage V.",
|
||||||
"enableMultiJS": false,
|
"enableMultiJS": false,
|
||||||
"longName": "PebbLisp",
|
"longName": "PebbLisp",
|
||||||
"projectType": "native",
|
"projectType": "native",
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 891 B |
Binary file not shown.
Binary file not shown.
30
src/calc.c
30
src/calc.c
|
@ -35,6 +35,17 @@ static void up_down_handler(ClickRecognizerRef recognizer, void *context){
|
||||||
updateText();
|
updateText();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void back_handler(ClickRecognizerRef recognizer, void *context) {
|
||||||
|
if(mytext[0] == '\0') {
|
||||||
|
window_stack_remove(window_stack_get_top_window(), true);
|
||||||
|
} else {
|
||||||
|
int i = 0;
|
||||||
|
while(mytext[++i] != '\0') { ; }
|
||||||
|
mytext[i-1] = '\0';
|
||||||
|
updateText();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Adds the current string to the main string
|
// Adds the current string to the main string
|
||||||
static void enter(){
|
static void enter(){
|
||||||
strcat(mytext, getToken(selected_token));
|
strcat(mytext, getToken(selected_token));
|
||||||
|
@ -45,10 +56,10 @@ static void enter(){
|
||||||
//Calculate result, display it and reset
|
//Calculate result, display it and reset
|
||||||
static void calculate(){
|
static void calculate(){
|
||||||
Object obj = parseEval(mytext, &env);
|
Object obj = parseEval(mytext, &env);
|
||||||
snprintf(mytext, MAX_LENGTH, "R:%d", obj.number);
|
snprintf(resulttext, MAX_LENGTH, "R:%d", obj.number);
|
||||||
selected_token = 0;
|
selected_token = 0;
|
||||||
//strcpy(mytext, HAHA);
|
//strcpy(mytext, HAHA);
|
||||||
updateText();
|
text_layer_set_text(s_result_text_layer, resulttext);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Button press handler
|
// Button press handler
|
||||||
|
@ -64,22 +75,31 @@ static void click_config_provider(void *context) {
|
||||||
window_single_repeating_click_subscribe(BUTTON_ID_UP, 100, up_down_handler);
|
window_single_repeating_click_subscribe(BUTTON_ID_UP, 100, up_down_handler);
|
||||||
window_single_repeating_click_subscribe(BUTTON_ID_DOWN, 100, up_down_handler);
|
window_single_repeating_click_subscribe(BUTTON_ID_DOWN, 100, up_down_handler);
|
||||||
window_single_click_subscribe(BUTTON_ID_SELECT, select_handler);
|
window_single_click_subscribe(BUTTON_ID_SELECT, select_handler);
|
||||||
|
window_single_click_subscribe(BUTTON_ID_BACK, back_handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void init(void) {
|
static void init(void) {
|
||||||
// Create a window and get information about the window
|
// Create a window and get information about the window
|
||||||
s_window = window_create();
|
s_window = window_create();
|
||||||
Layer *window_layer = window_get_root_layer(s_window);
|
// Layer *window_layer = window_get_root_layer(s_window);
|
||||||
// Register click config provider
|
// Register click config provider
|
||||||
window_set_click_config_provider(s_window, click_config_provider);
|
window_set_click_config_provider(s_window, click_config_provider);
|
||||||
|
|
||||||
// Input text layer setup
|
// Input text layer setup
|
||||||
GRect text_bounds = GRect(6, 6, 132, 132);
|
GRect text_bounds = GRect(6, 6, 132, 127);
|
||||||
s_input_text_layer = text_layer_create(text_bounds);
|
s_input_text_layer = text_layer_create(text_bounds);
|
||||||
text_layer_set_text(s_input_text_layer, getToken(1));
|
text_layer_set_text(s_input_text_layer, getToken(1));
|
||||||
text_layer_set_font(s_input_text_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));
|
text_layer_set_font(s_input_text_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD));
|
||||||
layer_add_child(window_get_root_layer(s_window), text_layer_get_layer(s_input_text_layer));
|
layer_add_child(window_get_root_layer(s_window), text_layer_get_layer(s_input_text_layer));
|
||||||
|
|
||||||
|
// Result text layer setup
|
||||||
|
GRect result_bounds = GRect(6, 128, 132, 132);
|
||||||
|
s_result_text_layer = text_layer_create(result_bounds);
|
||||||
|
text_layer_set_text(s_result_text_layer, "R: ");
|
||||||
|
text_layer_set_font(s_result_text_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD));
|
||||||
|
text_layer_set_text_alignment(s_result_text_layer, GTextAlignmentRight);
|
||||||
|
layer_add_child(window_get_root_layer(s_window), text_layer_get_layer(s_result_text_layer));
|
||||||
|
|
||||||
// Push the window, setting the window animation to 'true'
|
// Push the window, setting the window animation to 'true'
|
||||||
window_stack_push(s_window, true);
|
window_stack_push(s_window, true);
|
||||||
env = defaultEnv();
|
env = defaultEnv();
|
||||||
|
|
|
@ -8,11 +8,11 @@
|
||||||
// Layers
|
// Layers
|
||||||
Window *s_window;
|
Window *s_window;
|
||||||
TextLayer *s_input_text_layer;
|
TextLayer *s_input_text_layer;
|
||||||
|
TextLayer *s_result_text_layer;
|
||||||
const char *HAHA = "STONKS";
|
|
||||||
|
|
||||||
char mytext[SMAX_LENGTH] = "";
|
char mytext[SMAX_LENGTH] = "";
|
||||||
char temptext[SMAX_LENGTH] = "";
|
char temptext[SMAX_LENGTH] = "";
|
||||||
|
char resulttext[MAX_LENGTH] = "";
|
||||||
|
|
||||||
char *tokens[] = {
|
char *tokens[] = {
|
||||||
" ", "(", ")",
|
" ", "(", ")",
|
||||||
|
|
|
@ -46,7 +46,7 @@ Object fetchFromEnvironment(const char *name, struct Environment *env)
|
||||||
|
|
||||||
Result parse(struct Slice *slices)
|
Result parse(struct Slice *slices)
|
||||||
{
|
{
|
||||||
// printf("parse()\n");
|
printf("parse() START\n");
|
||||||
struct Slice *token = slices;
|
struct Slice *token = slices;
|
||||||
struct Slice *rest;
|
struct Slice *rest;
|
||||||
if(token->text != NULL) {
|
if(token->text != NULL) {
|
||||||
|
@ -62,11 +62,12 @@ Result parse(struct Slice *slices)
|
||||||
} else { // todo error on closed paren
|
} else { // todo error on closed paren
|
||||||
return R(parseAtom(token), rest);
|
return R(parseAtom(token), rest);
|
||||||
}
|
}
|
||||||
|
printf("parse() END\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
Result readSeq(struct Slice *tokens)
|
Result readSeq(struct Slice *tokens)
|
||||||
{
|
{
|
||||||
// printf("readSeq()\n");
|
printf("readSeq() START\n");
|
||||||
Object res;
|
Object res;
|
||||||
res.forward = NULL;
|
res.forward = NULL;
|
||||||
res.type = TYPE_LIST;
|
res.type = TYPE_LIST;
|
||||||
|
@ -80,13 +81,16 @@ Result readSeq(struct Slice *tokens)
|
||||||
return R(res, rest);
|
return R(res, rest);
|
||||||
}
|
}
|
||||||
Result r = parse(tokens);
|
Result r = parse(tokens);
|
||||||
march->forward = malloc(sizeof(Object));
|
printf("readSeq() before malloc\n");
|
||||||
|
march->forward = malloc(sizeof(struct Object));
|
||||||
|
printf("readSeq() after malloc\n");
|
||||||
*march->forward = r.obj;
|
*march->forward = r.obj;
|
||||||
// char out[MAX_TOK_LEN];
|
// char out[MAX_TOK_LEN];
|
||||||
// printf("stringObj: %s\n", stringObj(out, &r.obj));
|
// printf("stringObj: %s\n", stringObj(out, &r.obj));
|
||||||
tokens = r.slices;
|
tokens = r.slices;
|
||||||
march = march->forward;
|
march = march->forward;
|
||||||
}
|
}
|
||||||
|
printf("readSeq() END\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
Object parseAtom(struct Slice *s)
|
Object parseAtom(struct Slice *s)
|
||||||
|
@ -111,6 +115,8 @@ Object parseAtom(struct Slice *s)
|
||||||
|
|
||||||
Object eval(Object *obj, struct Environment *env)
|
Object eval(Object *obj, struct Environment *env)
|
||||||
{
|
{
|
||||||
|
printf("eval(): ");
|
||||||
|
printObj(obj);
|
||||||
Object o = *obj;
|
Object o = *obj;
|
||||||
switch(obj->type) {
|
switch(obj->type) {
|
||||||
case TYPE_NUMBER:
|
case TYPE_NUMBER:
|
||||||
|
@ -122,7 +128,9 @@ Object eval(Object *obj, struct Environment *env)
|
||||||
// printf("TYPE_LIST\n");
|
// printf("TYPE_LIST\n");
|
||||||
Object first_form = *obj->forward;
|
Object first_form = *obj->forward;
|
||||||
Object first_eval = eval(&first_form, env);
|
Object first_eval = eval(&first_form, env);
|
||||||
return first_eval.func(*first_form.forward, *first_form.forward->forward);
|
Object arg1 = eval(first_form.forward, env);
|
||||||
|
Object arg2 = eval(first_form.forward->forward, env);
|
||||||
|
return first_eval.func(arg1, arg2);
|
||||||
}
|
}
|
||||||
case TYPE_SYMBOL:
|
case TYPE_SYMBOL:
|
||||||
{
|
{
|
||||||
|
@ -145,6 +153,22 @@ char* stringObj(char *dest, Object *obj)
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void printObj(Object *obj)
|
||||||
|
{
|
||||||
|
if(obj->type == TYPE_NUMBER) {
|
||||||
|
printf("TYPE_NUMBER");
|
||||||
|
} else if(obj->type == TYPE_LIST) {
|
||||||
|
printf("TYPE_NUMBER");
|
||||||
|
} else if(obj->type == TYPE_SYMBOL) {
|
||||||
|
printf("TYPE_NUMBER");
|
||||||
|
} else {
|
||||||
|
printf("TYPE_OTHER");
|
||||||
|
}
|
||||||
|
char temp[20];
|
||||||
|
stringObj(temp, obj);
|
||||||
|
printf(": %s\n", temp);
|
||||||
|
}
|
||||||
|
|
||||||
Result resultFromObjAndSlices(Object obj, struct Slice *slices)
|
Result resultFromObjAndSlices(Object obj, struct Slice *slices)
|
||||||
{
|
{
|
||||||
Result r;
|
Result r;
|
||||||
|
@ -211,6 +235,9 @@ void addFunc(const char *name, Object (*func)(Object, Object),
|
||||||
struct Environment defaultEnv() {
|
struct Environment defaultEnv() {
|
||||||
struct Environment e;
|
struct Environment e;
|
||||||
e.strings = malloc(sizeof(char*) * MAX_ENV_ELM);
|
e.strings = malloc(sizeof(char*) * MAX_ENV_ELM);
|
||||||
|
for(int i = 0; i < MAX_ENV_ELM; i++) {
|
||||||
|
e.strings[i] = NULL;
|
||||||
|
}
|
||||||
e.objects = malloc(sizeof(Object) * MAX_ENV_ELM);
|
e.objects = malloc(sizeof(Object) * MAX_ENV_ELM);
|
||||||
addFunc("+", &add, &e);
|
addFunc("+", &add, &e);
|
||||||
addFunc("-", &sub, &e);
|
addFunc("-", &sub, &e);
|
||||||
|
@ -248,6 +275,7 @@ Object parseEval(const char *input, struct Environment *env)
|
||||||
// printf("parseEval() parse()\n");
|
// printf("parseEval() parse()\n");
|
||||||
#endif
|
#endif
|
||||||
Object parsed = parse(tokens).obj;
|
Object parsed = parse(tokens).obj;
|
||||||
|
free(tokens);
|
||||||
return eval(&parsed, env);
|
return eval(&parsed, env);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,9 +3,9 @@
|
||||||
|
|
||||||
// #define STANDALONE
|
// #define STANDALONE
|
||||||
|
|
||||||
#define MAX_TOK_LEN 3
|
#define MAX_TOK_LEN 4
|
||||||
#define MAX_TOK_CNT 7 // 128
|
#define MAX_TOK_CNT 128 // 128
|
||||||
#define MAX_ENV_ELM 3 // 50
|
#define MAX_ENV_ELM 15 // 50
|
||||||
|
|
||||||
// static const char* tokenFail = "Missing ')'\n";
|
// static const char* tokenFail = "Missing ')'\n";
|
||||||
|
|
||||||
|
@ -69,6 +69,7 @@ Object parseAtom(struct Slice *slice);
|
||||||
void copySlice(char * dest, struct Slice *src);
|
void copySlice(char * dest, struct Slice *src);
|
||||||
Object parseEval(const char *input, struct Environment *env);
|
Object parseEval(const char *input, struct Environment *env);
|
||||||
struct Environment defaultEnv();
|
struct Environment defaultEnv();
|
||||||
|
void printObj(Object *obj);
|
||||||
|
|
||||||
Result resultFromObjAndSlices(Object obj, struct Slice *slices);
|
Result resultFromObjAndSlices(Object obj, struct Slice *slices);
|
||||||
Object add(Object obj1, Object obj2);
|
Object add(Object obj1, Object obj2);
|
||||||
|
|
Loading…
Reference in New Issue