simplifying copy-list
improving the gambit-like read-line function adding with-output-to-string
This commit is contained in:
parent
222eead750
commit
8eb100a3cf
|
@ -276,7 +276,15 @@
|
||||||
(define make-table table)
|
(define make-table table)
|
||||||
(define table-ref get)
|
(define table-ref get)
|
||||||
(define table-set! put!)
|
(define table-set! put!)
|
||||||
(define (read-line (s *input-stream*)) (io.readline s))
|
(define (read-line (s *input-stream*))
|
||||||
|
(io.flush *output-stream*)
|
||||||
|
(io.discardbuffer s)
|
||||||
|
(io.readline s))
|
||||||
(define (shell-command s) 1)
|
(define (shell-command s) 1)
|
||||||
(define (error-exception-message e) e)
|
(define (error-exception-message e) (cadr e))
|
||||||
(define (error-exception-parameters e) e)
|
(define (error-exception-parameters e) (cddr e))
|
||||||
|
|
||||||
|
(define (with-output-to-string nada thunk)
|
||||||
|
(let ((b (buffer)))
|
||||||
|
(with-output-to b (thunk))
|
||||||
|
(io.tostring! b)))
|
||||||
|
|
|
@ -754,40 +754,31 @@ static value_t _list(value_t *args, uint32_t nargs, int star)
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define FL_COPYLIST(l) apply_liststar((l),0)
|
static value_t copy_list(value_t L)
|
||||||
|
|
||||||
// perform (apply list* L)
|
|
||||||
// like the function list() above, but takes arguments from a list
|
|
||||||
// rather than from an array (the stack)
|
|
||||||
// if !star, then it performs copy-list
|
|
||||||
static value_t apply_liststar(value_t L, int star)
|
|
||||||
{
|
{
|
||||||
PUSH(NIL);
|
if (!iscons(L))
|
||||||
|
return NIL;
|
||||||
PUSH(NIL);
|
PUSH(NIL);
|
||||||
PUSH(L);
|
PUSH(L);
|
||||||
value_t *pfirst = &Stack[SP-3];
|
|
||||||
value_t *plcons = &Stack[SP-2];
|
value_t *plcons = &Stack[SP-2];
|
||||||
value_t *pL = &Stack[SP-1];
|
value_t *pL = &Stack[SP-1];
|
||||||
value_t c;
|
value_t c;
|
||||||
|
c = mk_cons(); PUSH(c); // save first cons
|
||||||
|
car_(c) = car_(*pL);
|
||||||
|
cdr_(c) = NIL;
|
||||||
|
*plcons = c;
|
||||||
|
*pL = cdr_(*pL);
|
||||||
while (iscons(*pL)) {
|
while (iscons(*pL)) {
|
||||||
if (!star || iscons(cdr_(*pL))) {
|
|
||||||
c = mk_cons();
|
c = mk_cons();
|
||||||
car_(c) = car_(*pL);
|
car_(c) = car_(*pL);
|
||||||
cdr_(c) = NIL;
|
cdr_(c) = NIL;
|
||||||
}
|
|
||||||
else {
|
|
||||||
// last element; becomes final CDR
|
|
||||||
c = car_(*pL);
|
|
||||||
}
|
|
||||||
if (*pfirst == NIL)
|
|
||||||
*pfirst = c;
|
|
||||||
else
|
|
||||||
cdr_(*plcons) = c;
|
cdr_(*plcons) = c;
|
||||||
*plcons = c;
|
*plcons = c;
|
||||||
*pL = cdr_(*pL);
|
*pL = cdr_(*pL);
|
||||||
}
|
}
|
||||||
|
c = POP(); // first cons
|
||||||
POPN(2);
|
POPN(2);
|
||||||
return POP();
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
static value_t do_trycatch()
|
static value_t do_trycatch()
|
||||||
|
@ -2082,7 +2073,7 @@ static value_t fl_function_name(value_t *args, uint32_t nargs)
|
||||||
value_t fl_copylist(value_t *args, u_int32_t nargs)
|
value_t fl_copylist(value_t *args, u_int32_t nargs)
|
||||||
{
|
{
|
||||||
argcount("copy-list", nargs, 1);
|
argcount("copy-list", nargs, 1);
|
||||||
return FL_COPYLIST(args[0]);
|
return copy_list(args[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
value_t fl_append(value_t *args, u_int32_t nargs)
|
value_t fl_append(value_t *args, u_int32_t nargs)
|
||||||
|
@ -2097,7 +2088,7 @@ value_t fl_append(value_t *args, u_int32_t nargs)
|
||||||
lst = args[i++];
|
lst = args[i++];
|
||||||
if (i >= nargs) break;
|
if (i >= nargs) break;
|
||||||
if (iscons(lst)) {
|
if (iscons(lst)) {
|
||||||
lst = FL_COPYLIST(lst);
|
lst = copy_list(lst);
|
||||||
if (first == NIL)
|
if (first == NIL)
|
||||||
first = lst;
|
first = lst;
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue