… | |
… | |
329 | string_value (pointer p) |
329 | string_value (pointer p) |
330 | { |
330 | { |
331 | return strvalue (p); |
331 | return strvalue (p); |
332 | } |
332 | } |
333 | |
333 | |
334 | #define ivalue_unchecked(p) CELL(p)->object.ivalue |
334 | #define ivalue_unchecked(p) (CELL(p)->object.ivalue + 0) |
335 | #define set_ivalue(p,v) CELL(p)->object.ivalue = (v) |
335 | #define set_ivalue(p,v) CELL(p)->object.ivalue = (v) |
336 | |
336 | |
337 | #if USE_REAL |
337 | #if USE_REAL |
338 | #define rvalue_unchecked(p) CELL(p)->object.rvalue |
338 | #define rvalue_unchecked(p) CELL(p)->object.rvalue |
339 | #define set_rvalue(p,v) CELL(p)->object.rvalue = (v) |
339 | #define set_rvalue(p,v) CELL(p)->object.rvalue = (v) |
… | |
… | |
1259 | if (!*pp) |
1259 | if (!*pp) |
1260 | { |
1260 | { |
1261 | pointer x = get_cell (SCHEME_A_ NIL, NIL); |
1261 | pointer x = get_cell (SCHEME_A_ NIL, NIL); |
1262 | |
1262 | |
1263 | set_typeflag (x, T_INTEGER | T_ATOM); |
1263 | set_typeflag (x, T_INTEGER | T_ATOM); |
1264 | setimmutable (x); /* shouldn't do anythi9ng, doesn't cost anything */ |
1264 | setimmutable (x); /* shouldn't do anything, doesn't cost anything */ |
1265 | set_ivalue (x, n); |
1265 | set_ivalue (x, n); |
1266 | |
1266 | |
1267 | *pp = x; |
1267 | *pp = x; |
1268 | } |
1268 | } |
1269 | |
1269 | |
… | |
… | |
1546 | return mk_character (SCHEME_A_ c); |
1546 | return mk_character (SCHEME_A_ c); |
1547 | } |
1547 | } |
1548 | else |
1548 | else |
1549 | { |
1549 | { |
1550 | /* identify base by string index */ |
1550 | /* identify base by string index */ |
1551 | const char baseidx[17] = "ffbf" "ffff" "ofdf" "ffff" "x"; |
1551 | const char baseidx[18] = "ffbf" "ffff" "ofdf" "ffff" "x"; |
1552 | char *base = strchr (baseidx, *name); |
1552 | char *base = strchr (baseidx, *name); |
1553 | |
1553 | |
1554 | if (base) |
1554 | if (base && *base) |
1555 | return mk_integer (SCHEME_A_ strtol (name + 1, 0, base - baseidx)); |
1555 | return mk_integer (SCHEME_A_ strtol (name + 1, 0, base - baseidx)); |
1556 | |
1556 | |
1557 | return NIL; |
1557 | return NIL; |
1558 | } |
1558 | } |
1559 | } |
1559 | } |
… | |
… | |
2613 | } |
2613 | } |
2614 | else if (is_symbol (l)) |
2614 | else if (is_symbol (l)) |
2615 | p = symname (l); |
2615 | p = symname (l); |
2616 | else if (is_proc (l)) |
2616 | else if (is_proc (l)) |
2617 | { |
2617 | { |
|
|
2618 | p = (char *)procname (l); // ok with r7rs display, but not r7rs write |
|
|
2619 | #if 0 |
2618 | #if USE_PRINTF |
2620 | #if USE_PRINTF |
2619 | p = SCHEME_V->strbuff; |
2621 | p = SCHEME_V->strbuff; |
2620 | snprintf (p, STRBUFFSIZE, "#<%s PROCEDURE %ld>", procname (l), procnum (l)); |
2622 | snprintf (p, STRBUFFSIZE, " PROCEDURE %ld>", procname (l), procnum (l)); |
2621 | #else |
2623 | #else |
2622 | p = "#<PROCEDURE>"; |
2624 | p = "#<PROCEDURE>"; |
|
|
2625 | #endif |
2623 | #endif |
2626 | #endif |
2624 | } |
2627 | } |
2625 | else if (is_macro (l)) |
2628 | else if (is_macro (l)) |
2626 | p = "#<MACRO>"; |
2629 | p = "#<MACRO>"; |
2627 | else if (is_closure (l)) |
2630 | else if (is_closure (l)) |
… | |
… | |
3391 | BOP_DEFINE, |
3394 | BOP_DEFINE, |
3392 | BOP_MACRO, |
3395 | BOP_MACRO, |
3393 | BOP_SET, |
3396 | BOP_SET, |
3394 | BOP_BEGIN, |
3397 | BOP_BEGIN, |
3395 | BOP_LAMBDA, |
3398 | BOP_LAMBDA, |
|
|
3399 | BOP_DELAY, |
3396 | BOP_OP, |
3400 | BOP_OP, |
3397 | }; |
3401 | }; |
3398 | |
3402 | |
3399 | ecb_cold static void compile_expr (SCHEME_P_ stream s, pointer x); |
3403 | ecb_cold static void compile_expr (SCHEME_P_ stream s, pointer x); |
3400 | |
3404 | |
… | |
… | |
3519 | { |
3523 | { |
3520 | pointer head = car (x); |
3524 | pointer head = car (x); |
3521 | |
3525 | |
3522 | if (is_syntax (head)) |
3526 | if (is_syntax (head)) |
3523 | { |
3527 | { |
|
|
3528 | int syn = syntaxnum (head); |
3524 | x = cdr (x); |
3529 | x = cdr (x); |
3525 | |
3530 | |
3526 | switch (syntaxnum (head)) |
3531 | switch (syntaxnum (head)) |
3527 | { |
3532 | { |
3528 | case OP_IF0: /* if */ |
3533 | case OP_IF0: /* if */ |
… | |
… | |
3551 | break; |
3556 | break; |
3552 | |
3557 | |
3553 | case OP_LET0: /* let */ |
3558 | case OP_LET0: /* let */ |
3554 | case OP_LET0AST: /* let* */ |
3559 | case OP_LET0AST: /* let* */ |
3555 | case OP_LET0REC: /* letrec */ |
3560 | case OP_LET0REC: /* letrec */ |
3556 | switch (syntaxnum (head)) |
3561 | switch (syn) |
3557 | { |
3562 | { |
3558 | case OP_LET0: stream_put (s, BOP_LET ); break; |
3563 | case OP_LET0: stream_put (s, BOP_LET ); break; |
3559 | case OP_LET0AST: stream_put (s, BOP_LETAST); break; |
3564 | case OP_LET0AST: stream_put (s, BOP_LETAST); break; |
3560 | case OP_LET0REC: stream_put (s, BOP_LETREC); break; |
3565 | case OP_LET0REC: stream_put (s, BOP_LETREC); break; |
3561 | } |
3566 | } |
… | |
… | |
3600 | case OP_BEGIN: /* begin */ |
3605 | case OP_BEGIN: /* begin */ |
3601 | stream_put (s, BOP_BEGIN); |
3606 | stream_put (s, BOP_BEGIN); |
3602 | compile_list (SCHEME_A_ s, x); |
3607 | compile_list (SCHEME_A_ s, x); |
3603 | return; |
3608 | return; |
3604 | |
3609 | |
3605 | case OP_DELAY: /* delay */ |
|
|
3606 | abort (); |
|
|
3607 | break; |
|
|
3608 | |
|
|
3609 | case OP_QUOTE: /* quote */ |
3610 | case OP_QUOTE: /* quote */ |
3610 | stream_put_tv (s, BOP_DATUM, cell_id (SCHEME_A_ x)); |
3611 | stream_put_tv (s, BOP_DATUM, cell_id (SCHEME_A_ x)); |
3611 | break; |
3612 | break; |
3612 | |
3613 | |
|
|
3614 | case OP_DELAY: /* delay */ |
3613 | case OP_LAMBDA: /* lambda */ |
3615 | case OP_LAMBDA: /* lambda */ |
3614 | { |
3616 | { |
3615 | pointer formals = car (x); |
3617 | pointer formals = car (x); |
3616 | pointer body = cadr (x); |
3618 | pointer body = cadr (x); |
3617 | |
3619 | |
3618 | stream_put (s, BOP_LAMBDA); |
3620 | stream_put (s, syn == OP_LAMBDA ? BOP_LAMBDA : BOP_DELAY); |
3619 | |
3621 | |
3620 | for (; is_pair (formals); formals = cdr (formals)) |
3622 | for (; is_pair (formals); formals = cdr (formals)) |
3621 | stream_put_v (s, symbol_id (SCHEME_A_ car (formals))); |
3623 | stream_put_v (s, symbol_id (SCHEME_A_ car (formals))); |
3622 | |
3624 | |
3623 | stream_put_v (s, 0); |
3625 | stream_put_v (s, 0); |
… | |
… | |
5597 | s_return (S_T); |
5599 | s_return (S_T); |
5598 | } |
5600 | } |
5599 | |
5601 | |
5600 | case OP_PVECFROM: |
5602 | case OP_PVECFROM: |
5601 | { |
5603 | { |
5602 | int i = ivalue_unchecked (cdr (args)); |
5604 | IVALUE i = ivalue_unchecked (cdr (args)); |
5603 | pointer vec = car (args); |
5605 | pointer vec = car (args); |
5604 | int len = veclength (vec); |
5606 | uint32_t len = veclength (vec); |
5605 | |
5607 | |
5606 | if (i == len) |
5608 | if (i == len) |
5607 | { |
5609 | { |
5608 | putcharacter (SCHEME_A_ ')'); |
5610 | putcharacter (SCHEME_A_ ')'); |
5609 | s_return (S_T); |
5611 | s_return (S_T); |
5610 | } |
5612 | } |
5611 | else |
5613 | else |
5612 | { |
5614 | { |
5613 | pointer elem = vector_get (vec, i); |
5615 | pointer elem = vector_get (vec, i); |
5614 | |
5616 | |
5615 | ivalue_unchecked (cdr (args)) = i + 1; |
5617 | set_cdr (args, mk_integer (SCHEME_A_ i + 1)); |
5616 | s_save (SCHEME_A_ OP_PVECFROM, args, NIL); |
5618 | s_save (SCHEME_A_ OP_PVECFROM, args, NIL); |
5617 | SCHEME_V->args = elem; |
5619 | SCHEME_V->args = elem; |
5618 | |
5620 | |
5619 | if (i > 0) |
5621 | if (i > 0) |
5620 | putcharacter (SCHEME_A_ ' '); |
5622 | putcharacter (SCHEME_A_ ' '); |
… | |
… | |
5920 | static pointer |
5922 | static pointer |
5921 | mk_proc (SCHEME_P_ enum scheme_opcodes op) |
5923 | mk_proc (SCHEME_P_ enum scheme_opcodes op) |
5922 | { |
5924 | { |
5923 | pointer y = get_cell (SCHEME_A_ NIL, NIL); |
5925 | pointer y = get_cell (SCHEME_A_ NIL, NIL); |
5924 | set_typeflag (y, (T_PROC | T_ATOM)); |
5926 | set_typeflag (y, (T_PROC | T_ATOM)); |
5925 | ivalue_unchecked (y) = op; |
5927 | set_ivalue (y, op); |
5926 | return y; |
5928 | return y; |
5927 | } |
5929 | } |
5928 | |
5930 | |
5929 | /* Hard-coded for the given keywords. Remember to rewrite if more are added! */ |
5931 | /* Hard-coded for the given keywords. Remember to rewrite if more are added! */ |
5930 | ecb_hot static int |
5932 | ecb_hot static int |