From 368abdee7869e99fa287ec2e6b099ee4584372e5 Mon Sep 17 00:00:00 2001 From: "Adam R. Nelson" Date: Thu, 11 Mar 2021 22:42:57 -0500 Subject: last-minute updates: clarify some documentation, add flexvector->generator --- implementation/flexvectors-body2.scm | 10 ++++++++++ implementation/flexvectors.sld | 2 +- implementation/tests.scm | 18 ++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) (limited to 'implementation') diff --git a/implementation/flexvectors-body2.scm b/implementation/flexvectors-body2.scm index ba3e2f5..6f37efe 100644 --- a/implementation/flexvectors-body2.scm +++ b/implementation/flexvectors-body2.scm @@ -389,3 +389,13 @@ (define (generator->flexvector g) (assume (procedure? g)) (flexvector-unfold eof-object? (lambda (x) x) (lambda (_) (g)) (g))) + +(define (flexvector->generator fv) + (assume (flexvector? fv)) + (let ((i 0)) + (lambda () + (if (< i (flexvector-length fv)) + (let ((element (flexvector-ref fv i))) + (set! i (+ i 1)) + element) + (eof-object))))) diff --git a/implementation/flexvectors.sld b/implementation/flexvectors.sld index 25e1543..4bc7da3 100644 --- a/implementation/flexvectors.sld +++ b/implementation/flexvectors.sld @@ -38,7 +38,7 @@ flexvector->vector flexvector->list flexvector->string vector->flexvector list->flexvector string->flexvector reverse-flexvector->list reverse-list->flexvector - generator->flexvector) + generator->flexvector flexvector->generator) (import (scheme base) (scheme case-lambda) diff --git a/implementation/tests.scm b/implementation/tests.scm index 329a8d6..e41f19c 100644 --- a/implementation/tests.scm +++ b/implementation/tests.scm @@ -64,6 +64,24 @@ (flexvector->vector (string->flexvector "abc"))) (test-equal "flexvector->string" "abc" (flexvector->string (flexvector #\a #\b #\c))) +(define genlist '(a b c)) +(define (mock-generator) + (if (pair? genlist) + (let ((value (car genlist))) + (set! genlist (cdr genlist)) + value) + (eof-object))) + +(test-equal "generator->flexvector" #(a b c) + (flexvector->vector (generator->flexvector mock-generator))) +(test-equal "flexvector->generator" '(a b c #t) + (let* ((gen (flexvector->generator (flexvector 'a 'b 'c))) + (one (gen)) + (two (gen)) + (three (gen)) + (four (eof-object? (gen)))) + (list one two three four))) + ; Nondestructive operations on one vector (let ((fv (flexvector 10 20 30))) (test-equal "flexvector->vector" #(10 20 30) (flexvector->vector fv)) -- cgit 1.4.1