(define *command-plugins* '()) (define *view-plugins* '()) (define *command-completions* (make-empty-completion-set)) (define (command-plugin-list) *command-plugins*) (define (view-plugin-list) *view-plugins*) (define (command-completions) *command-completions*) (define-record-type view-plugin :view-plugin (make-view-plugin constructor type-predicate) view-plugin? (constructor view-plugin-constructor) (type-predicate view-plugin-type-predicate)) (define-record-type command-plugin :command-plugin (make-command-plugin command completer evaluater) command-plugin? (command command-plugin-command) (completer command-plugin-completer) (evaluater command-plugin-evaluater)) (define (register-plugin! plugin) (cond ((command-plugin? plugin) (set! *command-plugins* (cons plugin *command-plugins*)) (set! *command-completions* (adjoin-completion-set *command-completions* (command-plugin-command plugin)))) ((view-plugin? plugin) (set! *view-plugins* (cons plugin *view-plugins*))) (error "unknown plugin type" plugin)))