mirror of
https://github.com/antirez/aocla
synced 2024-12-27 09:58:32 +01:00
Quoted symbols.
This commit is contained in:
parent
2ce51cf5a5
commit
6e4870766c
1 changed files with 16 additions and 0 deletions
16
aocla.c
16
aocla.c
|
@ -30,6 +30,9 @@ typedef struct obj {
|
||||||
struct { /* Mutable string & unmutable symbol. */
|
struct { /* Mutable string & unmutable symbol. */
|
||||||
char *ptr;
|
char *ptr;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
int quoted; /* Used for quoted symbols: when quoted they are
|
||||||
|
not executed, but just pushed on the stack by
|
||||||
|
eval(). */
|
||||||
} str;
|
} str;
|
||||||
};
|
};
|
||||||
} obj;
|
} obj;
|
||||||
|
@ -130,6 +133,7 @@ int issymbol(int c) {
|
||||||
case '>':
|
case '>':
|
||||||
case '<':
|
case '<':
|
||||||
case '_':
|
case '_':
|
||||||
|
case '\'':
|
||||||
return 1;
|
return 1;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -203,6 +207,12 @@ obj *newList(aoclactx *ctx, const char *s, const char **next) {
|
||||||
return NULL;
|
return NULL;
|
||||||
} else if (issymbol(s[0])) { /* Symbol. */
|
} else if (issymbol(s[0])) { /* Symbol. */
|
||||||
o->type = OBJ_TYPE_SYMBOL;
|
o->type = OBJ_TYPE_SYMBOL;
|
||||||
|
if (s[0] == '\'') {
|
||||||
|
o->str.quoted = 1;
|
||||||
|
s++;
|
||||||
|
} else {
|
||||||
|
o->str.quoted = 0;
|
||||||
|
}
|
||||||
const char *end = s;
|
const char *end = s;
|
||||||
while(issymbol(*end)) end++;
|
while(issymbol(*end)) end++;
|
||||||
o->str.len = end-s;
|
o->str.len = end-s;
|
||||||
|
@ -443,6 +453,12 @@ int eval(aoclactx *ctx, obj *l) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case OBJ_TYPE_SYMBOL:
|
case OBJ_TYPE_SYMBOL:
|
||||||
|
/* Quoted symbols don't generate a procedure call, but like
|
||||||
|
* any other object they get pushed on the stack. */
|
||||||
|
if (o->str.quoted) {
|
||||||
|
stackPush(ctx,o);
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (o->str.ptr[0] == '$') { /* Push local var. */
|
if (o->str.ptr[0] == '$') { /* Push local var. */
|
||||||
int idx = o->str.ptr[1];
|
int idx = o->str.ptr[1];
|
||||||
if (ctx->frame->locals[idx] == NULL) {
|
if (ctx->frame->locals[idx] == NULL) {
|
||||||
|
|
Loading…
Reference in a new issue