~ chicken-core (chicken-5) afa4512d8cd9ea482acab0adea812b16b16de339
commit afa4512d8cd9ea482acab0adea812b16b16de339 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Tue Feb 1 13:01:26 2011 +0100 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Tue Feb 1 13:01:26 2011 +0100 added subvector; types.db enhancements; better handling of not in specializer signature; slight optimization in reverse-string->list diff --git a/chicken.import.scm b/chicken.import.scm index 863bd8c2..77bb385d 100644 --- a/chicken.import.scm +++ b/chicken.import.scm @@ -215,6 +215,7 @@ string->uninterned-symbol strip-syntax sub1 + subvector symbol-append symbol-escape symbol-plist diff --git a/data-structures.scm b/data-structures.scm index 85d42d10..b03318eb 100644 --- a/data-structures.scm +++ b/data-structures.scm @@ -266,20 +266,18 @@ EOF ; (reverse-string-append l) = (apply string-append (reverse l)) (define (reverse-string-append l) - (define (rev-string-append l i) (if (pair? l) (let* ((str (car l)) (len (string-length str)) - (result (rev-string-append (cdr l) (+ i len)))) - (let loop ((j 0) (k (- (- (string-length result) i) len))) - (if (< j len) + (result (rev-string-append (cdr l) (fx+ i len)))) + (let loop ((j 0) (k (fx- (fx- (string-length result) i) len))) + (if (fx< j len) (begin (string-set! result k (string-ref str j)) - (loop (+ j 1) (+ k 1))) + (loop (fx+ j 1) (fx+ k 1))) result))) (make-string i))) - (rev-string-append l 0)) ;;; Anything->string conversion: diff --git a/library.scm b/library.scm index 4635af06..f714eaa1 100644 --- a/library.scm +++ b/library.scm @@ -1349,18 +1349,30 @@ EOF (define (vector-copy! from to . n) (##sys#check-vector from 'vector-copy!) (##sys#check-vector to 'vector-copy!) - (let* ([len-from (##sys#size from)] - [len-to (##sys#size to)] - [n (if (pair? n) (car n) (fxmin len-to len-from))] ) + (let* ((len-from (##sys#size from)) + (len-to (##sys#size to)) + (n (if (pair? n) (car n) (fxmin len-to len-from))) ) (##sys#check-exact n 'vector-copy!) (when (or (fx> n len-to) (fx> n len-from)) (##sys#signal-hook #:bounds-error 'vector-copy! "cannot copy vector - count exceeds length" from to n) ) - (do ([i 0 (fx+ i 1)]) + (do ((i 0 (fx+ i 1))) ((fx>= i n)) (##sys#setslot to i (##sys#slot from i)) ) ) ) +(define (subvector v i #!optional j) + (##sys#check-vector v 'subvector) + (let* ((len (##sys#size v)) + (j (or j len)) + (len2 (fx- j i))) + (##sys#check-range i 0 len 'subvector) + (##sys#check-range j 0 len 'subvector) + (let ((v2 (make-vector len2))) + (do ((k 0 (fx+ k 1))) + ((fx>= k len2) v2) + (##sys#setslot v2 k (##sys#slot v (fx+ k i))))))) + (define (vector-resize v n #!optional init) (##sys#check-vector v 'vector-resize) (##sys#check-exact n 'vector-resize) diff --git a/manual/Accessing external objects b/manual/Accessing external objects index e043e926..6a1323ee 100644 --- a/manual/Accessing external objects +++ b/manual/Accessing external objects @@ -142,9 +142,10 @@ in {{STRING ...}}: (my-strlen "one two three") ==> 13 </enscript> -For obscure technical reasons you should use the {{C_return}} macro instead of the normal {{return}} statement -to return a result from the foreign lambda body as some cleanup code has to be run before execution -commences in the calling code. +For obscure technical reasons you should use the {{C_return}} macro +instead of the normal {{return}} statement to return a result from the +foreign lambda body as some cleanup code has to be run before +execution commences in the calling code. === foreign-safe-lambda diff --git a/manual/Unit library b/manual/Unit library index 6584fe1c..a684cfe8 100644 --- a/manual/Unit library +++ b/manual/Unit library @@ -943,6 +943,13 @@ additional items are initialized to {{INIT}}. If {{INIT}} is not specified, the contents are initialized to some unspecified value. +==== subvector + +<procedure>(subvector VECTOR FROM [TO])</procedure> + +Returns a new vector with elements taken from {{VECTOR}} in the +given range. {{TO}} defaults to {{(vector-length VECTOR)}}. + === The unspecified value diff --git a/manual/Using the interpreter b/manual/Using the interpreter index 5248a991..1e981a05 100644 --- a/manual/Using the interpreter +++ b/manual/Using the interpreter @@ -252,27 +252,32 @@ The {{,e}} command runs the editor given by: === History access The interpreter toplevel accepts the special object {{#[INDEX]}} which -returns the result of entry number {{INDEX}} in the history list. If the expression -for that entry resulted in multiple values, the first result (or an unspecified value for no values) -is returned. If no {{INDEX}} is given (and if a whitespace or closing paranthesis character follows -the {{#}}, then the result of the last expression is returned. -Note that the value returned is implicitly quoted. +returns the result of entry number {{INDEX}} in the history list. If +the expression for that entry resulted in multiple values, the first +result (or an unspecified value for no values) is returned. If no +{{INDEX}} is given (and if a whitespace or closing paranthesis +character follows the {{#}}, then the result of the last expression is +returned. Note that the value returned is implicitly quoted. === set-describer! <procedure>(set-describer! TAG PROC)</procedure> -Sets a custom description handler that invokes {{PROC}} when the {{,d}} command is invoked -with a record-type object that has the type {{TAG}} (a symbol). {{PROC}} is called with -two arguments: the object to be described and an output-port. It should write a possibly useful -textual description of the object to the passed output-port. For example: +Sets a custom description handler that invokes {{PROC}} when the +{{,d}} command is invoked with a record-type object that has the type +{{TAG}} (a symbol). {{PROC}} is called with two arguments: the object +to be described and an output-port. It should write a possibly useful +textual description of the object to the passed output-port. For +example: #;1> (define-record-type point (make-point x y) point? (x point-x) (y point-y)) #;2> (set-describer! 'point (lambda (pt o) - (print "a point with x=" (point-x pt) " and y=" (point-y pt)))) + (with-output-to-port o + (lambda () + (print "a point with x=" (point-x pt) " and y=" (point-y pt)))))) #;3> ,d (make-point 1 2) a point with x=1 and y=2 diff --git a/scrutinizer.scm b/scrutinizer.scm index 1303f126..e9b6ded5 100755 --- a/scrutinizer.scm +++ b/scrutinizer.scm @@ -702,8 +702,11 @@ (define (match st t) (if (pair? st) (case (car st) - ((not) (not (equal? (cadr st) t))) - ((or) (any (cut equal? <> t) (cdr st))) + ((not) + (if (and (pair? t) (eq? 'or (car t))) + (not (any (cute match (cadr st) <>) (cdr t))) + (not (match (cadr st) t)))) + ((or) (any (cut match <> t) (cdr st))) (else (equal? st t))) (eq? st t))) (let loop ((tl typelist) (atypes atypes)) diff --git a/types.db b/types.db index 9d291514..9d791d46 100644 --- a/types.db +++ b/types.db @@ -262,10 +262,13 @@ (argv (procedure argv () list)) (arithmetic-shift (procedure arithmetic-shift (number number) number)) (bit-set? (procedure bit-set? (number fixnum) boolean)) -(bitwise-and (procedure bitwise-and (#!rest number) number)) -(bitwise-ior (procedure bitwise-ior (#!rest number) number)) +(bitwise-and (procedure bitwise-and (#!rest number) number) + ((fixnum fixnum) (fxand #(1) #(2)))) +(bitwise-ior (procedure bitwise-ior (#!rest number) number) + ((fixnum fixnum) (fxior #(1) #(2)))) (bitwise-not (procedure bitwise-not (number) number)) -(bitwise-xor (procedure bitwise-xor (#!rest number) number)) +(bitwise-xor (procedure bitwise-xor (#!rest number) number) + ((fixnum fixnum) (fxxor #(1) #(2)))) (blob->string (procedure blob->string (blob) string)) (blob-size (procedure blob-size (blob) fixnum)) (blob? (procedure blob? (*) boolean)) @@ -310,7 +313,8 @@ (directory-exists? (procedure directory-exists? (string) *)) (fixnum-bits fixnum) (fixnum-precision fixnum) -(fixnum? (procedure fixnum? (*) boolean)) +(fixnum? (procedure fixnum? (*) boolean) + ((fixnum) #t)) (flonum-decimal-precision fixnum) (flonum-epsilon float) (flonum-maximum-decimal-exponent fixnum) @@ -320,7 +324,8 @@ (flonum-precision fixnum) (flonum-print-precision (procedure (#!optional fixnum) fixnum)) (flonum-radix fixnum) -(flonum? (procedure flonum? (*) boolean)) +(flonum? (procedure flonum? (*) boolean) + ((float) #t)) (flush-output (procedure flush-output (#!optional port) undefined)) (force-finalizers (procedure force-finalizers () undefined)) (fp- (procedure fp- (float float) float)) @@ -445,6 +450,7 @@ (string->uninterned-symbol (procedure string->uninterned-symbol (string) symbol)) (strip-syntax (procedure strip-syntax (*) *)) (sub1 (procedure sub1 (number) number)) +(subvector (procedure subvector (vector fixnum #!optional fixnum) vector)) (symbol-escape (procedure symbol-escape (#!optional *) *)) (symbol-plist (procedure symbol-plist (symbol) list)) (syntax-error (procedure syntax-error (#!rest) noreturn))Trap