allowing logand, logior, logxor to accept any number of arguments
adding negative?, positive?, zero?, even?, odd?, for-each adding *linefeed*, terpri
This commit is contained in:
parent
d81e6c2d57
commit
bfa30fb095
|
@ -490,26 +490,6 @@ size_t cvalue_arraylen(value_t v)
|
||||||
return cv_len(cv)/(cv_class(cv)->elsz);
|
return cv_len(cv)/(cv_class(cv)->elsz);
|
||||||
}
|
}
|
||||||
|
|
||||||
static value_t cvalue_relocate(value_t v)
|
|
||||||
{
|
|
||||||
size_t nw;
|
|
||||||
cvalue_t *cv = (cvalue_t*)ptr(v);
|
|
||||||
cvalue_t *nv;
|
|
||||||
value_t ncv;
|
|
||||||
|
|
||||||
nw = cv_nwords(cv);
|
|
||||||
nv = (cvalue_t*)alloc_words(nw);
|
|
||||||
memcpy(nv, cv, nw*sizeof(value_t));
|
|
||||||
if (isinlined(cv))
|
|
||||||
nv->data = &nv->_space[0];
|
|
||||||
ncv = tagptr(nv, TAG_CVALUE);
|
|
||||||
fltype_t *t = cv_class(cv);
|
|
||||||
if (t->vtable != NULL && t->vtable->relocate != NULL)
|
|
||||||
t->vtable->relocate(v, ncv);
|
|
||||||
forward(v, ncv);
|
|
||||||
return ncv;
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t cvalue_struct_offs(value_t type, value_t field, int computeTotal,
|
static size_t cvalue_struct_offs(value_t type, value_t field, int computeTotal,
|
||||||
int *palign)
|
int *palign)
|
||||||
{
|
{
|
||||||
|
@ -664,6 +644,26 @@ value_t cvalue_typeof(value_t *args, u_int32_t nargs)
|
||||||
return cv_type((cvalue_t*)ptr(args[0]));
|
return cv_type((cvalue_t*)ptr(args[0]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
value_t cvalue_relocate(value_t v)
|
||||||
|
{
|
||||||
|
size_t nw;
|
||||||
|
cvalue_t *cv = (cvalue_t*)ptr(v);
|
||||||
|
cvalue_t *nv;
|
||||||
|
value_t ncv;
|
||||||
|
|
||||||
|
nw = cv_nwords(cv);
|
||||||
|
nv = (cvalue_t*)alloc_words(nw);
|
||||||
|
memcpy(nv, cv, nw*sizeof(value_t));
|
||||||
|
if (isinlined(cv))
|
||||||
|
nv->data = &nv->_space[0];
|
||||||
|
ncv = tagptr(nv, TAG_CVALUE);
|
||||||
|
fltype_t *t = cv_class(cv);
|
||||||
|
if (t->vtable != NULL && t->vtable->relocate != NULL)
|
||||||
|
t->vtable->relocate(v, ncv);
|
||||||
|
forward(v, ncv);
|
||||||
|
return ncv;
|
||||||
|
}
|
||||||
|
|
||||||
value_t cvalue_copy(value_t v)
|
value_t cvalue_copy(value_t v)
|
||||||
{
|
{
|
||||||
assert(iscvalue(v));
|
assert(iscvalue(v));
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
it uses a Scheme-style evaluation rule where any expression may appear in
|
it uses a Scheme-style evaluation rule where any expression may appear in
|
||||||
head position as long as it evaluates to a function.
|
head position as long as it evaluates to a function.
|
||||||
it uses Scheme-style varargs (dotted formal argument lists)
|
it uses Scheme-style varargs (dotted formal argument lists)
|
||||||
lambdas can have only 1 body expression; use (progn ...) for multiple
|
lambdas can have only 1 body expression; use (begin ...) for multiple
|
||||||
expressions. this is due to the closure representation
|
expressions. this is due to the closure representation
|
||||||
(lambda args body . env)
|
(lambda args body . env)
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@
|
||||||
* constructor notation for nicely printing arbitrary values
|
* constructor notation for nicely printing arbitrary values
|
||||||
* strings
|
* strings
|
||||||
* hash tables
|
* hash tables
|
||||||
|
* I/O streams
|
||||||
|
|
||||||
by Jeff Bezanson (C) 2009
|
by Jeff Bezanson (C) 2009
|
||||||
Distributed under the BSD License
|
Distributed under the BSD License
|
||||||
|
@ -894,7 +895,7 @@ static value_t eval_sexpr(value_t e, uint32_t penv, int tail)
|
||||||
}
|
}
|
||||||
v = *pv;
|
v = *pv;
|
||||||
break;
|
break;
|
||||||
case F_PROGN:
|
case F_BEGIN:
|
||||||
// return last arg
|
// return last arg
|
||||||
pv = &Stack[saveSP];
|
pv = &Stack[saveSP];
|
||||||
if (iscons(*pv)) {
|
if (iscons(*pv)) {
|
||||||
|
@ -1153,25 +1154,52 @@ static value_t eval_sexpr(value_t e, uint32_t penv, int tail)
|
||||||
v = fl_bitwise_not(Stack[SP-1]);
|
v = fl_bitwise_not(Stack[SP-1]);
|
||||||
break;
|
break;
|
||||||
case F_BAND:
|
case F_BAND:
|
||||||
argcount("logand", nargs, 2);
|
if (nargs == 0)
|
||||||
if (bothfixnums(Stack[SP-1], Stack[SP-2]))
|
v = fixnum(-1);
|
||||||
v = Stack[SP-1] & Stack[SP-2];
|
else {
|
||||||
else
|
v = Stack[SP-nargs];
|
||||||
v = fl_bitwise_op(Stack[SP-2], Stack[SP-1], 0, "&");
|
while (nargs > 1) {
|
||||||
|
e = Stack[SP-nargs+1];
|
||||||
|
if (bothfixnums(v, e))
|
||||||
|
v = v & e;
|
||||||
|
else
|
||||||
|
v = fl_bitwise_op(v, e, 0, "&");
|
||||||
|
nargs--;
|
||||||
|
Stack[SP-nargs] = v;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case F_BOR:
|
case F_BOR:
|
||||||
argcount("logior", nargs, 2);
|
if (nargs == 0)
|
||||||
if (bothfixnums(Stack[SP-1], Stack[SP-2]))
|
v = fixnum(0);
|
||||||
v = Stack[SP-1] | Stack[SP-2];
|
else {
|
||||||
else
|
v = Stack[SP-nargs];
|
||||||
v = fl_bitwise_op(Stack[SP-2], Stack[SP-1], 1, "!");
|
while (nargs > 1) {
|
||||||
|
e = Stack[SP-nargs+1];
|
||||||
|
if (bothfixnums(v, e))
|
||||||
|
v = v | e;
|
||||||
|
else
|
||||||
|
v = fl_bitwise_op(v, e, 1, "!");
|
||||||
|
nargs--;
|
||||||
|
Stack[SP-nargs] = v;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case F_BXOR:
|
case F_BXOR:
|
||||||
argcount("logxor", nargs, 2);
|
if (nargs == 0)
|
||||||
if (bothfixnums(Stack[SP-1], Stack[SP-2]))
|
v = fixnum(0);
|
||||||
v = fixnum(numval(Stack[SP-1]) ^ numval(Stack[SP-2]));
|
else {
|
||||||
else
|
v = Stack[SP-nargs];
|
||||||
v = fl_bitwise_op(Stack[SP-2], Stack[SP-1], 2, "$");
|
while (nargs > 1) {
|
||||||
|
e = Stack[SP-nargs+1];
|
||||||
|
if (bothfixnums(v, e))
|
||||||
|
v = fixnum(numval(v) ^ numval(e));
|
||||||
|
else
|
||||||
|
v = fl_bitwise_op(v, e, 2, "$");
|
||||||
|
nargs--;
|
||||||
|
Stack[SP-nargs] = v;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case F_ASH:
|
case F_ASH:
|
||||||
argcount("ash", nargs, 2);
|
argcount("ash", nargs, 2);
|
||||||
|
|
|
@ -102,7 +102,7 @@ extern uint32_t SP;
|
||||||
enum {
|
enum {
|
||||||
// special forms
|
// special forms
|
||||||
F_QUOTE=0, F_COND, F_IF, F_AND, F_OR, F_WHILE, F_LAMBDA,
|
F_QUOTE=0, F_COND, F_IF, F_AND, F_OR, F_WHILE, F_LAMBDA,
|
||||||
F_TRYCATCH, F_SPECIAL_APPLY, F_SETQ, F_PROGN,
|
F_TRYCATCH, F_SPECIAL_APPLY, F_SETQ, F_BEGIN,
|
||||||
|
|
||||||
// functions
|
// functions
|
||||||
F_EQ, F_EQV, F_EQUAL, F_ATOM, F_NOT, F_NULL, F_BOOLEANP, F_SYMBOLP,
|
F_EQ, F_EQV, F_EQUAL, F_ATOM, F_NOT, F_NULL, F_BOOLEANP, F_SYMBOLP,
|
||||||
|
@ -116,7 +116,7 @@ enum {
|
||||||
F_TRUE, F_FALSE, F_NIL,
|
F_TRUE, F_FALSE, F_NIL,
|
||||||
N_BUILTINS,
|
N_BUILTINS,
|
||||||
};
|
};
|
||||||
#define isspecial(v) (uintval(v) <= (unsigned int)F_PROGN)
|
#define isspecial(v) (uintval(v) <= (unsigned int)F_BEGIN)
|
||||||
|
|
||||||
extern value_t NIL, FL_T, FL_F;
|
extern value_t NIL, FL_T, FL_F;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
; -*- scheme -*-
|
||||||
|
|
||||||
|
(define (rule30-step b)
|
||||||
|
(let ((L (ash b -1))
|
||||||
|
(R (ash b 1)))
|
||||||
|
(let ((~b (lognot b))
|
||||||
|
(~L (lognot L))
|
||||||
|
(~R (lognot R)))
|
||||||
|
(logior (logand L ~b ~R)
|
||||||
|
(logand ~L b R)
|
||||||
|
(logand ~L b ~R)
|
||||||
|
(logand ~L ~b R)))))
|
||||||
|
|
||||||
|
(define (nestlist f zero n)
|
||||||
|
(if (<= n 0) ()
|
||||||
|
(cons zero (nestlist f (f zero) (- n 1)))))
|
||||||
|
|
||||||
|
(define (make-string k ch)
|
||||||
|
(cond ((<= k 0) "")
|
||||||
|
((= k 1) (string ch))
|
||||||
|
((= k 2) (string ch ch))
|
||||||
|
((odd? k) (string ch (make-string (- k 1) ch)))
|
||||||
|
(else (let ((half (make-string (/ k 2) ch)))
|
||||||
|
(string half half)))))
|
||||||
|
|
||||||
|
(define (pad0 s n) (string (make-string (- n (length s)) "0") s))
|
||||||
|
|
||||||
|
(define (bin-draw s)
|
||||||
|
(string.map (lambda (c) (case c
|
||||||
|
(#\1 #\#)
|
||||||
|
(#\0 #\ )
|
||||||
|
(else c)))
|
||||||
|
s))
|
||||||
|
|
||||||
|
(for-each (lambda (n)
|
||||||
|
(begin
|
||||||
|
(princ (bin-draw (pad0 (number->string n 2) 63)))
|
||||||
|
(terpri)))
|
||||||
|
(nestlist rule30-step (uint64 0x0000000080000000) 32))
|
|
@ -195,6 +195,11 @@
|
||||||
(define (> a b) (< b a))
|
(define (> a b) (< b a))
|
||||||
(define (<= a b) (not (< b a)))
|
(define (<= a b) (not (< b a)))
|
||||||
(define (>= a b) (not (< a b)))
|
(define (>= a b) (not (< a b)))
|
||||||
|
(define (negative? x) (< x 0))
|
||||||
|
(define (zero? x) (= x 0))
|
||||||
|
(define (positive? x) (> x 0))
|
||||||
|
(define (even? x) (= (logand x 1) 0))
|
||||||
|
(define (odd? x) (not (even? x)))
|
||||||
(define (1+ n) (+ n 1))
|
(define (1+ n) (+ n 1))
|
||||||
(define (1- n) (- n 1))
|
(define (1- n) (- n 1))
|
||||||
(define (mod x y) (- x (* (/ x y) y)))
|
(define (mod x y) (- x (* (/ x y) y)))
|
||||||
|
@ -467,6 +472,12 @@
|
||||||
(define (iota n) (map-int identity n))
|
(define (iota n) (map-int identity n))
|
||||||
(define ι iota)
|
(define ι iota)
|
||||||
|
|
||||||
|
(define (for-each f l)
|
||||||
|
(when (pair? l)
|
||||||
|
(begin (f (car l))
|
||||||
|
(for-each f (cdr l))))
|
||||||
|
#t)
|
||||||
|
|
||||||
(define (error . args) (raise (cons 'error args)))
|
(define (error . args) (raise (cons 'error args)))
|
||||||
|
|
||||||
(define-macro (throw tag value) `(raise (list 'thrown-value ,tag ,value)))
|
(define-macro (throw tag value) `(raise (list 'thrown-value ,tag ,value)))
|
||||||
|
@ -485,6 +496,14 @@
|
||||||
(lambda (,e) (begin ,finally (raise ,e))))
|
(lambda (,e) (begin ,finally (raise ,e))))
|
||||||
,finally)))
|
,finally)))
|
||||||
|
|
||||||
|
(if (or (eq? *os-name* 'win32)
|
||||||
|
(eq? *os-name* 'win64)
|
||||||
|
(eq? *os-name* 'windows))
|
||||||
|
(begin (define *directory-separator* "\\")
|
||||||
|
(define *linefeed* "\r\n"))
|
||||||
|
(begin (define *directory-separator* "/")
|
||||||
|
(define *linefeed* "\n")))
|
||||||
|
|
||||||
(define-macro (assert expr) `(if ,expr #t (raise '(assert-failed ,expr))))
|
(define-macro (assert expr) `(if ,expr #t (raise '(assert-failed ,expr))))
|
||||||
|
|
||||||
(define-macro (time expr)
|
(define-macro (time expr)
|
||||||
|
@ -494,8 +513,9 @@
|
||||||
,expr
|
,expr
|
||||||
(princ "Elapsed time: " (- (time.now) ,t0) " seconds\n")))))
|
(princ "Elapsed time: " (- (time.now) ,t0) " seconds\n")))))
|
||||||
|
|
||||||
|
(define (terpri) (princ *linefeed*))
|
||||||
(define (display x) (princ x) #t)
|
(define (display x) (princ x) #t)
|
||||||
(define (println . args) (prog1 (apply print args) (princ "\n")))
|
(define (println . args) (prog1 (apply print args) (terpri)))
|
||||||
|
|
||||||
(define (vu8 . elts) (apply array (cons 'uint8 elts)))
|
(define (vu8 . elts) (apply array (cons 'uint8 elts)))
|
||||||
|
|
||||||
|
@ -598,12 +618,12 @@
|
||||||
(set! that V)
|
(set! that V)
|
||||||
#t))))
|
#t))))
|
||||||
(define (reploop)
|
(define (reploop)
|
||||||
(when (trycatch (and (prompt) (princ "\n"))
|
(when (trycatch (and (prompt) (terpri))
|
||||||
print-exception)
|
print-exception)
|
||||||
(begin (princ "\n")
|
(begin (terpri)
|
||||||
(reploop))))
|
(reploop))))
|
||||||
(reploop)
|
(reploop)
|
||||||
(princ "\n"))
|
(terpri))
|
||||||
|
|
||||||
(define (print-exception e)
|
(define (print-exception e)
|
||||||
(cond ((and (pair? e)
|
(cond ((and (pair? e)
|
||||||
|
@ -641,7 +661,7 @@
|
||||||
(else (io.princ *stderr* "*** Unhandled exception: ")
|
(else (io.princ *stderr* "*** Unhandled exception: ")
|
||||||
(io.print *stderr* e)))
|
(io.print *stderr* e)))
|
||||||
|
|
||||||
(io.princ *stderr* "\n")
|
(io.princ *stderr* *linefeed*)
|
||||||
#t)
|
#t)
|
||||||
|
|
||||||
(define (__script fname)
|
(define (__script fname)
|
||||||
|
@ -649,12 +669,6 @@
|
||||||
(lambda (e) (begin (print-exception e)
|
(lambda (e) (begin (print-exception e)
|
||||||
(exit 1)))))
|
(exit 1)))))
|
||||||
|
|
||||||
(if (or (eq? *os-name* 'win32)
|
|
||||||
(eq? *os-name* 'win64)
|
|
||||||
(eq? *os-name* 'windows))
|
|
||||||
(define *directory-separator* "\\")
|
|
||||||
(define *directory-separator* "/"))
|
|
||||||
|
|
||||||
(define (__start . argv)
|
(define (__start . argv)
|
||||||
; reload this file with our new definition of load
|
; reload this file with our new definition of load
|
||||||
(load (string *install-dir* *directory-separator* "system.lsp"))
|
(load (string *install-dir* *directory-separator* "system.lsp"))
|
||||||
|
|
|
@ -848,10 +848,10 @@ IOStream API
|
||||||
*princ
|
*princ
|
||||||
*file
|
*file
|
||||||
iostream - (stream[ cvalue-as-bytestream])
|
iostream - (stream[ cvalue-as-bytestream])
|
||||||
*memstream
|
*buffer
|
||||||
fifo
|
fifo
|
||||||
socket
|
socket
|
||||||
*io.eof
|
*io.eof?
|
||||||
*io.flush
|
*io.flush
|
||||||
*io.close
|
*io.close
|
||||||
*io.discardbuffer
|
*io.discardbuffer
|
||||||
|
@ -950,7 +950,7 @@ consolidated todo list as of 8/30:
|
||||||
* finalizers in gc
|
* finalizers in gc
|
||||||
* hashtable
|
* hashtable
|
||||||
* generic aref/aset
|
* generic aref/aset
|
||||||
- expose io stream object
|
* expose io stream object
|
||||||
* new toplevel
|
* new toplevel
|
||||||
|
|
||||||
* make raising a memory error non-consing
|
* make raising a memory error non-consing
|
||||||
|
|
Loading…
Reference in New Issue