From bb0de3e949440872576805fa06720b6e41f96220 Mon Sep 17 00:00:00 2001 From: Linus Date: Thu, 18 Feb 2021 22:06:59 +0100 Subject: [PATCH] Added some generator clauses Now in-file, in-port, in-lists and in-generator have generator clauses --- goof.scm | 2 +- goof/iterators.scm | 83 +++++++++++++++++++++++++++++++++++++--------- 2 files changed, 68 insertions(+), 17 deletions(-) diff --git a/goof.scm b/goof.scm index f1b22a9..dc2b660 100644 --- a/goof.scm +++ b/goof.scm @@ -33,7 +33,7 @@ #:use-module (goof helpers) #:use-module (goof ref-let) #:use-module (rnrs io simple) - #:use-module ((srfi srfi-1) #:select (circular-list find)) + #:use-module ((srfi srfi-1) #:select (any circular-list find)) #:use-module ((srfi srfi-43) #:select (vector-copy vector-copy!)) #:use-module (srfi srfi-71) #:use-module (ice-9 futures) diff --git a/goof/iterators.scm b/goof/iterators.scm index 9539f17..4fff15f 100644 --- a/goof/iterators.scm +++ b/goof/iterators.scm @@ -101,7 +101,23 @@ ((elts (map car pairs)) (succ (map step pairs))) () - . rest)))) + . rest)) + ;; Generator clause + ((in-lists lists ...) + (gen-lists lists ...)))) + + +;; TODO: make this not slow. +(define (gen-lists . lists) + (lambda () + (if (any null? lists) + (eof-object) + (let ((cars (map car lists)) + (cdrs (map cdr lists))) + (set! lists cdrs) + (values cars))))) + + (define-syntax define-in-indexed (syntax-rules () @@ -156,22 +172,52 @@ ((eof? var)) () () - . rest)))) + . rest)) + ;; generator clauses + ((in-port port) + (gen-port port read-char eof-object?)) + ((in-port port reader) + (gen-port port reader eof-object?)) + ((in-port port reader eof?) + (gen-port port reader eof?)))) + +(define (gen-port port read eof?) + (lambda () + (let ((res (read port))) + (if (eof? res) + (eof-object) + res)))) (define-syntax in-file -(syntax-rules () - ((in-file ((var) source) next . rest) - (in-file ((var p) source) next . rest)) - ((in-file ((var p) (file)) next . rest) - (in-file ((var p) (file read-char)) next . rest)) - ((in-file ((var p) (file reader)) next . rest) - (in-file ((var p) (file reader eof-object?)) next . rest)) - ((in-file ((var p) (file reader eof?)) next . rest) - (next ((p (open-input-file file)) (r reader) (e? eof?)) - ((var (r p) (r p))) - ((e? var)) - () - ((close-input-port p)) . rest)))) + (syntax-rules () + ((in-file ((var) source) next . rest) + (in-file ((var p) source) next . rest)) + ((in-file ((var p) (file)) next . rest) + (in-file ((var p) (file read-char)) next . rest)) + ((in-file ((var p) (file reader)) next . rest) + (in-file ((var p) (file reader eof-object?)) next . rest)) + ((in-file ((var p) (file reader eof?)) next . rest) + (next ((p (open-input-file file)) (r reader) (e? eof?)) + ((var (r p) (r p))) + ((e? var)) + () + ((close-input-port p)) . rest)) + ;; generator clauses + ((in-file path) + (gen-file path read-char eof-object?)) + ((in-file path read) + (gen-file path read eof-object?)) + ((in-file path read eof?) + (gen-file path read eof?)))) + +(define (gen-file path read eof?) + (let ((file (open-input-file path))) + (lambda () + (let ((res (read file))) + (cond ((eof? res) + (close-port file) + (eof-object)) + (else res)))))) (define-syntax in-generator (syntax-rules () @@ -181,7 +227,12 @@ ((eof-object? var)) () () - . rest)))) + . rest)) + ;; yes, generator clause + ((in-generator gen) + (let ((g gen)) + (lambda () + (g)))))) (define-syntax up-from (syntax-rules (to by)