#| Copyright 2024 Peter McGoron | | Licensed under the Apache License, Version 2.0 (the "License"); | you may not use this file except in compliance with the License. | You may obtain a copy of the License at | | http://www.apache.org/licenses/LICENSE-2.0 | | Unless required by applicable law or agreed to in writing, software | distributed under the License is distributed on an "AS IS" BASIS, | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | See the License for the specific language governing permissions and | limitations under the License. |# (define-record-type (make-iterator-container closure capabilities type) iterator? (closure iterator-closure) (capabilities iterator-capabilities) (type iterator-type)) (define (iterator-invoke itr field . args) ((iterator-closure itr) field args)) (define-syntax define-invocation (syntax-rules () ((define-invocation name args ...) (define (name itr args ...) (iterator-invoke itr (quote name) args ...))))) (define-syntax define-iterator-implementation (syntax-rules (else) ((_ (cstr cstr-args ...) self ((name . formal) body ...) ...) (define (cstr cstr-args ...) (letrec ((self (make-iterator-container (lambda (type args) (case type ((name) (apply (lambda formal body ...) args)) ... (else (raise (not-implemented-exception self type args))))) '(name ...) (quote cstr)))) self))))) (define-invocation iterator-at-start?) (define-invocation iterator-at-end?) (define-invocation iterator-advance spaces) (define-invocation iterator-ref) (define-invocation iterator-set! val) (define-invocation iterator->index) (define (iterator-next itr) (iterator-advance itr 1)) (define (iterator-prev itr) (iterator-advance itr -1))