From 0fe4342c25a3db2f077f0fe9f90abc4394e358c1 Mon Sep 17 00:00:00 2001 From: Ludovic Court`es Date: Wed, 27 Sep 2006 13:57:53 +0000 Subject: Fixed creation of engines from an engine class. * src/guile/skribilo/engine.scm (): Inherit from `' for which there exists an `initialize' method. (make-engine-class): Use `make-class' rather than just `(make ...)'. (engine-class): New. (initialize): Removed. (make-instance)[initialize-engine!]: New. (make-engine): Don't pass `:customs'. git-archimport-id: lcourtes@laas.fr--2005-libre/skribilo--engine-classes--1.2--patch-2 --- src/guile/skribilo/engine.scm | 47 +++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/src/guile/skribilo/engine.scm b/src/guile/skribilo/engine.scm index 0622e11..163fe06 100644 --- a/src/guile/skribilo/engine.scm +++ b/src/guile/skribilo/engine.scm @@ -107,23 +107,10 @@ (customs :init-keyword :custom :init-value '()) (symbol-table :init-keyword :symbol-table :init-value '())) -(define-class () +(define-class () (customs :init-keyword :customs :init-value '()) :metaclass ) -(define-method (compute-cpl (class )) - ;; Automatically set the class precedence list of subclasses. - (format (current-error-port) "computing CPL for ~a~%" class) - (list class )) - -(define-method (initialize (engine-class ) . args) - ;; Set the name of subclasses. - (let ((result (next-method)) - (ident (slot-ref engine-class 'ident))) - (slot-set! engine-class 'name - (symbol-append ')) - result)) - (define %format format) (define* (make-engine-class ident :key (version 'unspecified) @@ -133,7 +120,11 @@ (symbol-table '()) (custom '()) (info '())) - (let ((e (make + ;; We use `make-class' from `(oop goops)' (currently undocumented). + (let ((e (make-class (list ) '() + :metaclass + :name (symbol-append ') + :ident ident :version version :format format :filter filter :delegate delegate :symbol-table symbol-table @@ -169,27 +160,34 @@ (define (engine? obj) (is-a? obj )) +(define (engine-class e) + (and (engine? e) (class-of e))) + ;; A mapping of engine classes to hooks. (define %engine-instantiate-hook (make-hash-table)) -(define-method (initialize (engine ) . args) - (format (current-error-port) "initializing engine ~a~%" engine) - engine) - (define-method (make-instance (class ) . args) + (define (initialize-engine! engine) + ;; Automatically initialize the `customs' slot of the newly created + ;; engine. + (let ((init-values (engine-class-customs class))) + (slot-set! engine 'customs (map list-copy init-values)) + engine)) + (format #t "making engine of class ~a~%" class) (let ((engine (next-method))) (if (engine? engine) - (let ((hook (hashq-ref %engine-instantiate-hook engine-class))) + (let ((hook (hashq-ref %engine-instantiate-hook class))) (format (current-error-port) "engine made: ~a~%" engine) + (initialize-engine! engine) (if (hook? hook) (run-hook hook engine class)) engine) engine))) (define (make-engine engine-class) - (make engine-class - :customs (list-copy (slot-ref engine-class 'customs)))) + (make engine-class)) + ;; Convenience functions. @@ -209,6 +207,11 @@ (string=? fmt (engine-format e))))) + +;;; +;;; Writers. +;;; + (define (engine-class-add-writer! e ident pred upred opt before action after class valid) ;; Add a writer to engine class E. If IDENT is a symbol, then it should -- cgit v1.2.3