Unified · Split
| @@ -53,6 +53,7 @@ atom? · 52 unmodified lines | ||
| 53 | 53 | boolean? |
| 54 | 54 | defined? |
| 55 | 55 | eq? |
| 56 | +equal? | |
| 56 | 57 | nan? |
| 57 | 58 | null? |
| 58 | 59 | number? |
| @@ -63,6 +63,7 @@ enum { · 62 unmodified lines | ||
| 63 | 63 | P_NOT, |
| 64 | 64 | P_DISPLAY, |
| 65 | 65 | P_EQ_HUH, |
| 66 | + P_EQUAL_HUH, | |
| 66 | 67 | P_ATOM_HUH, |
| 67 | 68 | P_NUMBER_HUH, |
| 68 | 69 | P_BOOLEAN_HUH, |
| @@ -103,6 +104,7 @@ static const char *primnames[P_MAX] = { · 34 unmodified lines | ||
| 103 | 104 | "not", |
| 104 | 105 | "display", |
| 105 | 106 | "eq?", |
| 107 | + "equal?", | |
| 106 | 108 | "atom?", |
| 107 | 109 | "number?", |
| 108 | 110 | "boolean?", |
| @@ -299,7 +301,7 @@ equal(aaObject *a, aaObject *b) · 190 unmodified lines | ||
| 299 | 301 | if(a == b) |
| 300 | 302 | return 1; |
| 301 | 303 | |
| 302 | − if(TYPE(a) != TYPE(b)) | |
| 304 | + if(TYPE(a) != TYPE(b) || TYPE(a) == AA_TBOOL) | |
| 303 | 305 | return 0; |
| 304 | 306 | |
| 305 | 307 | if(TYPE(a) == AA_TNUMBER) |
| @@ -313,6 +315,14 @@ equal(aaObject *a, aaObject *b) · 7 unmodified lines | ||
| 313 | 315 | return a == b; |
| 314 | 316 | } |
| 315 | 317 | |
| 318 | + if(TYPE(a) == AA_TPAIR){ | |
| 319 | + for(; !ISNULL(a); a = CDR(a), b = CDR(b)){ | |
| 320 | + if(!equal(CAR(a), CAR(b))) | |
| 321 | + return 0; | |
| 322 | + } | |
| 323 | + return a == b; | |
| 324 | + } | |
| 325 | + | |
| 316 | 326 | return 0; |
| 317 | 327 | } |
| 318 | 328 | |
| @@ -882,6 +892,11 @@ eval(aaContext *ctx, aaObject *obj, aaObject *env, aaObject **newenv) · 563 unmodified lines | ||
| 882 | 892 | noargs(); |
| 883 | 893 | break; |
| 884 | 894 | |
| 895 | + case P_EQUAL_HUH: | |
| 896 | + res = aa_bool(ctx, equal(evalarg(), evalarg())); | |
| 897 | + noargs(); | |
| 898 | + break; | |
| 899 | + | |
| 885 | 900 | case P_ATOM_HUH: |
| 886 | 901 | res = aa_bool(ctx, aa_type(ctx, evalarg()) != AA_TPAIR); |
| 887 | 902 | noargs(); |