| @@ -45,6 +45,7 @@ · 44 unmodified lines |
| 45 | 45 | enum { |
| 46 | 46 | P_LET, |
| 47 | 47 | P_DEFINE, |
| 48 | + P_SET_YAS, |
| 48 | 49 | P_IF, |
| 49 | 50 | P_LAMBDA, |
| 50 | 51 | P_MAC, |
| @@ -85,43 +86,44 @@ enum { · 34 unmodified lines |
| 85 | 86 | }; |
| 86 | 87 | |
| 87 | 88 | static const char *primnames[P_MAX] = { |
| 88 | | − "let", |
| 89 | | − "define", |
| 90 | | − "if", |
| 91 | | − "lambda", |
| 92 | | − "mac", |
| 93 | | − "while", |
| 94 | | − "quote", |
| 95 | | − "eval", |
| 96 | | − "and", |
| 97 | | − "or", |
| 98 | | − "begin", |
| 99 | | − "cons", |
| 100 | | − "car", |
| 101 | | − "cdr", |
| 102 | | − "setcar", |
| 103 | | − "setcdr", |
| 104 | | − "list", |
| 105 | | − "not", |
| 106 | | − "display", |
| 107 | | − "eq?", |
| 108 | | − "equal?", |
| 109 | | − "atom?", |
| 110 | | − "number?", |
| 111 | | − "boolean?", |
| 112 | | − "port?", |
| 113 | | − "defined?", |
| 114 | | − "string?", |
| 115 | | − "nan?", |
| 116 | | − "=", |
| 117 | | − "<", |
| 118 | | − ">", |
| 119 | | − "<=", |
| 120 | | − ">=", |
| 121 | | − "+", |
| 122 | | − "-", |
| 123 | | − "*", |
| 124 | | − "/", |
| 89 | + [P_LET] = "let", |
| 90 | + [P_DEFINE] = "define", |
| 91 | + [P_SET_YAS] = "set!", |
| 92 | + [P_IF] = "if", |
| 93 | + [P_LAMBDA] = "lambda", |
| 94 | + [P_MAC] = "mac", |
| 95 | + [P_WHILE] = "while", |
| 96 | + [P_QUOTE] = "quote", |
| 97 | + [P_EVAL] = "eval", |
| 98 | + [P_AND] = "and", |
| 99 | + [P_OR] = "or", |
| 100 | + [P_BEGIN] = "begin", |
| 101 | + [P_CONS] = "cons", |
| 102 | + [P_CAR] = "car", |
| 103 | + [P_CDR] = "cdr", |
| 104 | + [P_SETCAR] = "setcar", |
| 105 | + [P_SETCDR] = "setcdr", |
| 106 | + [P_LIST] = "list", |
| 107 | + [P_NOT] = "not", |
| 108 | + [P_DISPLAY] = "display", |
| 109 | + [P_EQ_HUH] = "eq?", |
| 110 | + [P_EQUAL_HUH] = "equal?", |
| 111 | + [P_ATOM_HUH] = "atom?", |
| 112 | + [P_NUMBER_HUH] = "number?", |
| 113 | + [P_BOOLEAN_HUH] = "boolean?", |
| 114 | + [P_PORT_HUH] = "port?", |
| 115 | + [P_DEFINED_HUH] = "defined?", |
| 116 | + [P_STRING_HUH] = "string?", |
| 117 | + [P_NAN_HUH] = "nan?", |
| 118 | + [P_EQN] = "=", |
| 119 | + [P_LT] = "<", |
| 120 | + [P_GT] = ">", |
| 121 | + [P_LTE] = "<=", |
| 122 | + [P_GTE] = ">=", |
| 123 | + [P_ADD] = "+", |
| 124 | + [P_SUB] = "-", |
| 125 | + [P_MUL] = "*", |
| 126 | + [P_DIV] = "/", |
| 125 | 127 | }; |
| 126 | 128 | |
| 127 | 129 | static const char *typenames[AA_TMAX] = { |
| @@ -785,6 +787,14 @@ eval(aaContext *ctx, aaObject *obj, aaObject *env, aaObject **newenv) · 657 unmodified lines |
| 785 | 787 | CDR(getbound(ctx, res, env)) = evalarg(); |
| 786 | 788 | break; |
| 787 | 789 | |
| 790 | + case P_SET_YAS: |
| 791 | + va = checktype(ctx, aa_nextarg(ctx, &arg, 0), AA_TSYMBOL); |
| 792 | + if(ISUNBOUND(CDR(CDR(va)))) |
| 793 | + aa_error(ctx, "unbound variable: %ß", va); |
| 794 | + else |
| 795 | + aa_set(ctx, va, evalarg()); |
| 796 | + break; |
| 797 | + |
| 788 | 798 | case P_IF: |
| 789 | 799 | while(!ISNULL(arg)){ |
| 790 | 800 | va = evalarg(); |