Add OTHER type. Auto-open script 0 on code-send
This commit is contained in:
parent
05d86d81be
commit
5644a46c3c
|
@ -334,6 +334,10 @@ Object add_window(Object obj1, Object obj2, struct Environment *env)
|
||||||
static void inbox_received_callback(DictionaryIterator *iter, void *context) {
|
static void inbox_received_callback(DictionaryIterator *iter, void *context) {
|
||||||
Tuple *script_tuple = dict_find(iter, MESSAGE_KEY_ScriptText);
|
Tuple *script_tuple = dict_find(iter, MESSAGE_KEY_ScriptText);
|
||||||
if(script_tuple) {
|
if(script_tuple) {
|
||||||
|
if(!s_code_window) {
|
||||||
|
current_code = 0;
|
||||||
|
code_window_push();
|
||||||
|
}
|
||||||
char *script_text = script_tuple->value->cstring;
|
char *script_text = script_tuple->value->cstring;
|
||||||
snprintf(temptext, sizeof(temptext), "%s", script_text);
|
snprintf(temptext, sizeof(temptext), "%s", script_text);
|
||||||
snprintf(mytext, sizeof(mytext), "%s", script_text);
|
snprintf(mytext, sizeof(mytext), "%s", script_text);
|
||||||
|
|
21
src/object.c
21
src/object.c
|
@ -105,6 +105,8 @@ inline int isEmpty(const Object *obj)
|
||||||
return obj->string == NULL || obj->string[0] == '\0';
|
return obj->string == NULL || obj->string[0] == '\0';
|
||||||
case TYPE_FUNC:
|
case TYPE_FUNC:
|
||||||
return obj->func == NULL;
|
return obj->func == NULL;
|
||||||
|
case TYPE_OTHER:
|
||||||
|
return obj->other == NULL;
|
||||||
case TYPE_ERROR:
|
case TYPE_ERROR:
|
||||||
return obj->err == 0;
|
return obj->err == 0;
|
||||||
}
|
}
|
||||||
|
@ -302,6 +304,10 @@ char* stringObj(char *dest, const Object *obj)
|
||||||
case TYPE_FUNC:
|
case TYPE_FUNC:
|
||||||
case TYPE_LAMBDA:
|
case TYPE_LAMBDA:
|
||||||
snprintf(dest, RESULT_LENGTH, "X%d", obj->number);
|
snprintf(dest, RESULT_LENGTH, "X%d", obj->number);
|
||||||
|
break;
|
||||||
|
case TYPE_OTHER:
|
||||||
|
snprintf(dest, RESULT_LENGTH, "%p", obj->other->data);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!isValidType(*obj))
|
if(!isValidType(*obj))
|
||||||
|
@ -350,6 +356,8 @@ void _printObj(const Object *obj, int newline)
|
||||||
printd("Lambda Body: \n");
|
printd("Lambda Body: \n");
|
||||||
printObj(&obj->lambda->body);
|
printObj(&obj->lambda->body);
|
||||||
return;
|
return;
|
||||||
|
case TYPE_OTHER:
|
||||||
|
printd("TYPE_OTHER: ");
|
||||||
case TYPE_ERROR:
|
case TYPE_ERROR:
|
||||||
printd("TYPE_ERROR: ");
|
printd("TYPE_ERROR: ");
|
||||||
break;
|
break;
|
||||||
|
@ -429,6 +437,10 @@ void cleanObject(Object *target)
|
||||||
cleanObject(&target->lambda->body);
|
cleanObject(&target->lambda->body);
|
||||||
free(target->lambda);
|
free(target->lambda);
|
||||||
break;
|
break;
|
||||||
|
case TYPE_OTHER:
|
||||||
|
target->other->cleanup(target);
|
||||||
|
free(target->other);
|
||||||
|
break;
|
||||||
case TYPE_BOOL:
|
case TYPE_BOOL:
|
||||||
case TYPE_NUMBER:
|
case TYPE_NUMBER:
|
||||||
case TYPE_FUNC:
|
case TYPE_FUNC:
|
||||||
|
@ -573,6 +585,7 @@ inline int isValidType(const Object test)
|
||||||
case TYPE_SYMBOL:
|
case TYPE_SYMBOL:
|
||||||
case TYPE_LAMBDA:
|
case TYPE_LAMBDA:
|
||||||
case TYPE_STRING:
|
case TYPE_STRING:
|
||||||
|
case TYPE_OTHER:
|
||||||
case TYPE_ERROR:
|
case TYPE_ERROR:
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -618,6 +631,7 @@ inline Object cloneObject(const Object src)
|
||||||
case TYPE_BOOL:
|
case TYPE_BOOL:
|
||||||
case TYPE_NUMBER:
|
case TYPE_NUMBER:
|
||||||
case TYPE_FUNC:
|
case TYPE_FUNC:
|
||||||
|
case TYPE_OTHER:
|
||||||
case TYPE_ERROR:
|
case TYPE_ERROR:
|
||||||
; // Fall through to plain return
|
; // Fall through to plain return
|
||||||
}
|
}
|
||||||
|
@ -677,6 +691,13 @@ inline int isError(const Object obj, const enum errorCode err)
|
||||||
return obj.type == TYPE_ERROR && obj.err == err;
|
return obj.type == TYPE_ERROR && obj.err == err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline Object otherObject()
|
||||||
|
{
|
||||||
|
Object o = newObject(TYPE_OTHER);
|
||||||
|
o.other = malloc(sizeof(struct Other));
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
inline Object errorObject(enum errorCode err)
|
inline Object errorObject(enum errorCode err)
|
||||||
{
|
{
|
||||||
Object o = newObject(TYPE_ERROR);
|
Object o = newObject(TYPE_ERROR);
|
||||||
|
|
11
src/object.h
11
src/object.h
|
@ -50,6 +50,7 @@ typedef enum Type {
|
||||||
TYPE_SYMBOL,
|
TYPE_SYMBOL,
|
||||||
TYPE_LAMBDA,
|
TYPE_LAMBDA,
|
||||||
TYPE_STRING,
|
TYPE_STRING,
|
||||||
|
TYPE_OTHER,
|
||||||
TYPE_ERROR
|
TYPE_ERROR
|
||||||
} Type;
|
} Type;
|
||||||
|
|
||||||
|
@ -57,6 +58,7 @@ typedef struct Object Object;
|
||||||
struct Lambda;
|
struct Lambda;
|
||||||
struct Environment;
|
struct Environment;
|
||||||
struct Slice;
|
struct Slice;
|
||||||
|
struct Other;
|
||||||
|
|
||||||
struct Object {
|
struct Object {
|
||||||
Type type;
|
Type type;
|
||||||
|
@ -67,6 +69,7 @@ struct Object {
|
||||||
char *string;
|
char *string;
|
||||||
Object (*func)(Object, Object, struct Environment *);
|
Object (*func)(Object, Object, struct Environment *);
|
||||||
struct Lambda *lambda;
|
struct Lambda *lambda;
|
||||||
|
struct Other *other;
|
||||||
enum errorCode err;
|
enum errorCode err;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -76,6 +79,11 @@ struct Lambda {
|
||||||
Object body;
|
Object body;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct Other {
|
||||||
|
void (*cleanup)(Object*);
|
||||||
|
void *data;
|
||||||
|
};
|
||||||
|
|
||||||
char* stringObj(char *dest, const Object *obj);
|
char* stringObj(char *dest, const Object *obj);
|
||||||
void printList(const Object *list);
|
void printList(const Object *list);
|
||||||
void printObj(const Object *obj);
|
void printObj(const Object *obj);
|
||||||
|
@ -110,12 +118,11 @@ Object cloneObject(const Object src);
|
||||||
Object newObject(Type type);
|
Object newObject(Type type);
|
||||||
Object listObject();
|
Object listObject();
|
||||||
Object startList(const Object start);
|
Object startList(const Object start);
|
||||||
Object lambdaObject();
|
|
||||||
Object symbolObject();
|
|
||||||
Object objFromSlice(const char *string, int len);
|
Object objFromSlice(const char *string, int len);
|
||||||
Object symFromSlice(const char *string, int len);
|
Object symFromSlice(const char *string, int len);
|
||||||
Object boolObject(int b);
|
Object boolObject(int b);
|
||||||
Object numberObject(int num);
|
Object numberObject(int num);
|
||||||
|
Object otherObject();
|
||||||
Object errorObject(enum errorCode err);
|
Object errorObject(enum errorCode err);
|
||||||
Object constructLambda(const Object *params, const Object *body);
|
Object constructLambda(const Object *params, const Object *body);
|
||||||
|
|
||||||
|
|
|
@ -172,6 +172,7 @@ Object eval(const Object *obj, struct Environment *env)
|
||||||
case TYPE_FUNC:
|
case TYPE_FUNC:
|
||||||
return *obj;
|
return *obj;
|
||||||
|
|
||||||
|
case TYPE_OTHER:
|
||||||
case TYPE_NUMBER:
|
case TYPE_NUMBER:
|
||||||
case TYPE_BOOL:
|
case TYPE_BOOL:
|
||||||
case TYPE_STRING:
|
case TYPE_STRING:
|
||||||
|
|
Loading…
Reference in New Issue