; ************************************************************************* ; Copyright (c) 1992 Xerox Corporation. ; All Rights Reserved. ; ; Use, reproduction, and preparation of derivative works are permitted. ; Any copy of this software or of any derivative work must include the ; above copyright notice of Xerox Corporation, this paragraph and the ; one after it. Any distribution of this software or derivative works ; must comply with all applicable United States export control laws. ; ; This software is made available AS IS, and XEROX CORPORATION DISCLAIMS ; ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE ; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ; PURPOSE, AND NOTWITHSTANDING ANY OTHER PROVISION CONTAINED HEREIN, ANY ; LIABILITY FOR DAMAGES RESULTING FROM THE SOFTWARE OR ITS USE IS ; EXPRESSLY DISCLAIMED, WHETHER ARISING IN CONTRACT, TORT (INCLUDING ; NEGLIGENCE) OR STRICT LIABILITY, EVEN IF XEROX CORPORATION IS ADVISED ; OF THE POSSIBILITY OF SUCH DAMAGES. ; ************************************************************************* ; ; port to R6RS -- 2007 Christian Sloma ; (library (clos std-protocols class-initialization) (export class-compute-precedence-list class-compute-slots class-compute-getter-and-setter) (import (only (rnrs) define let if null? reverse let* cons append cdr filter lambda eq? car begin set! quote) (clos introspection) (clos private top-sort) (clos private compat)) (define (class-compute-precedence-list class) (compute-standard-precedence-list class class-direct-supers)) (define (compute-standard-precedence-list class get-direct-supers) (top-sort ((build-transitive-closure get-direct-supers) class) ((build-constraints get-direct-supers) class) (standard-tie-breaker get-direct-supers))) (define (class-compute-slots class) (let loop ((todo (append-map class-direct-slots (class-precedence-list class))) (done '())) (if (null? todo) (reverse done) (let* ((curr (car todo)) (name (car curr)) (same '()) (rest (filter (lambda (slot) (if (eq? (car slot) name) (begin (set! same (cons slot same)) #f) #t)) (cdr todo)))) (loop rest (cons (append curr (append-map cdr same)) done)))))) (define (class-compute-getter-and-setter class slot allocator) (allocator (lambda () '()))) ) ;; library (clos std-protocols class-initialization)