; Copyright (c) 1993-1999 by Richard Kelsey and Jonathan Rees. See file COPYING. ; Some interfaces. Order of presentation is a bit random. (define-interface scheme-level-0-interface (export ((if begin lambda letrec quote set! define define-syntax let-syntax letrec-syntax) :syntax) ;; The basic derived expression types. ((and cond do let let* or) :syntax) apply ;; Scalar primitives eq? number? integer? rational? real? complex? exact? exact->inexact inexact->exact + - * / = < > <= >= quotient remainder floor numerator denominator real-part imag-part exp log sin cos tan asin acos atan sqrt angle magnitude make-polar make-rectangular char? char=? charstring string? make-string string-length string-ref string-set! vector? make-vector vector-length vector-ref vector-set! ;; Unnecessarily primitive read-char peek-char write-char string=? vector assq ;; New in Revised^5 Scheme values call-with-values ;; Things aren't primitive at the VM level, but they have ;; to be defined using VM primitives. string-copy string->symbol procedure? integer->char char->integer)) ; Miscellaneous primitives. (define-interface primitives-interface (export add-finalizer! call-external-value checked-record-ref checked-record-set! collect ;,collect command continuation-length continuation-ref continuation-set! continuation? copy-bytes! current-thread ;fluids threads double? eof-object ;i/o-internal re-exports this extended-number-length extended-number-ref extended-number-set! extended-number? find-all ;externals, command-levels find-all-records ;threads immutable? make-continuation make-double make-extended-number make-immutable! make-record make-template make-weak-pointer memory-status ;interrupts record record-length record-ref record-set! record? return-from-callback schedule-interrupt ;interrupts re-exports this session-data ;channels set-current-thread! ;fluids threads set-enabled-interrupts! ;interrupts set-exception-handlers! set-interrupt-handlers! ;interrupts set-session-data! ;channels string-hash template-length template-ref template-set! template? time unspecific ;record vm-extension wait weak-pointer-ref weak-pointer?)) (define-interface bitwise-interface (export arithmetic-shift bitwise-not ((bitwise-and bitwise-ior bitwise-xor) (proc (&rest :exact-integer) :exact-integer)))) (define-interface locations-interface (export location? location-defined? location-assigned? location-id set-location-id! make-undefined-location set-location-defined?! contents set-contents!)) (define-interface closures-interface (export closure? make-closure closure-env closure-template)) (define-interface byte-vectors-interface (export byte-vector? byte-vector-length byte-vector-ref byte-vector-set! make-byte-vector)) ; Same again, but with old names for compatibility. (define-interface code-vectors-interface (export code-vector? code-vector-length code-vector-ref code-vector-set! make-code-vector)) (define-interface channels-interface (export input-channel? open-input-channel channel-read close-input-channel output-channel? open-output-channel channel-write close-output-channel)) (define-interface low-channels-interface (export channel? channel-id channel-status channel-os-index channel-ready? open-channel close-channel channel-read channel-write channel-abort open-channels-list)) (define-interface channels-interface (export input-channel? open-input-channel channel-read close-input-channel output-channel? open-output-channel channel-write close-output-channel)) (define-interface ports-interface (export port? make-port port-handler set-port-handler! port-lock set-port-lock! port-locked? set-port-locked?! port-status set-port-status! port-data set-port-data! port-buffer set-port-buffer! port-index set-port-index! port-limit set-port-limit! port-pending-eof? set-port-pending-eof?!)) (define-interface locks-interface (export lock? make-lock obtain-lock maybe-obtain-lock release-lock lock-owner-uid)) ;really should be internal (define-interface shared-bindings-interface (export shared-binding? shared-binding-is-import? shared-binding-name shared-binding-ref shared-binding-set! lookup-imported-binding define-imported-binding undefine-imported-binding lookup-exported-binding define-exported-binding undefine-exported-binding)) ; Miscellaneous useful procedures used in various random places. ; These are used in the byte-code compiler and the linker and so have ; alternative implementations in alt/... (define-interface features-interface (export immutable? make-immutable! string-hash force-output current-noise-port)) ; Another hodge-podge. (define-interface low-level-interface (export vector-unassigned?)) ;inspector (define-interface vm-exposure-interface (export invoke-closure ;eval primitive-catch)) ;shadowing, start, command (define-interface escapes-interface (export primitive-cwcc with-continuation)) (define-interface ascii-interface (export ascii->char char->ascii ascii-limit ascii-whitespaces)) ; Level 1: The rest of Scheme except for I/O. (define-interface scheme-level-1-adds-interface (export ((case delay quasiquote syntax-rules) :syntax) abs append assoc assv boolean? caaaar caaadr caadar caaddr caaar caadr caar cadaar cadadr caddar cadddr cadar caddr cadr cdaaar cdaadr cdadar cdaddr cdaar cdadr cdar cddaar cddadr cdddar cddddr cddar cdddr cddr char->integer char-alphabetic? ceiling char-ci<=? char-ci=? char-ci>? char-downcase char-lower-case? char-numeric? char-upcase char-upper-case? char-whitespace? char<=? char>=? char>? equal? eqv? even? expt for-each force gcd inexact? integer->char lcm length list list->string list->vector list? ;New in R4RS list-ref list-tail map max member memq memv min modulo negative? not null? odd? positive? procedure? ;from low-level rationalize reverse round string string->list string->symbol string-append string-ci<=? string-ci=? string-ci>? string-copy ;from low-level string-fill! string<=? string=? string>? substring truncate vector->list vector-fill! zero?)) (define-interface scheme-level-1-interface (compound-interface scheme-level-1-adds-interface scheme-level-0-interface)) (define-interface util-interface (export any every filter fold fold->2 fold->3 last posq posv position reduce sublist insert unspecific)) ; Level 2 consists of harder things built on level 1. (define-interface records-interface (export make-record-type record-constructor record-accessor record-modifier record-predicate define-record-discloser define-record-resumer record-type? record-type-field-names record-type-name)) (define-interface records-internal-interface (export record record? record-type record-length record-ref record-set! :record-type disclose-record initialize-records!)) (define-interface define-record-types-interface (export (define-record-type :syntax) define-record-discloser)) (define-interface methods-interface (export (define-generic :syntax) (define-method :syntax) (define-simple-type :syntax) :values :value :number :complex :real :rational :integer :exact-integer :boolean :symbol :char :null :pair :vector :string :procedure :input-port :output-port :eof-object :record :record-type :zero singleton disclose &disclose)) (define-interface meta-methods-interface (export type-predicate &type-predicate type-priority &type-priority type-superiors &type-superiors same-type? &same-type? add-method! &add-method! set-final-method! make-method-table ;rts/exception.scm method-table-get-perform ;rts/exception.scm make-simple-type ;; Hooks for DOODL or other future extension :simple-type :method-info :method-table :singleton make-generic (method-info :syntax) methods->perform)) (define-interface number-i/o-interface (export number->string &number->string string->number really-string->number &really-string->number ;exactness argument string->integer)) (define-interface fluids-interface (export make-fluid let-fluid let-fluids fluid set-fluid!)) (define-interface fluids-internal-interface (export initialize-dynamic-state! current-thread set-current-thread! get-dynamic-env ; wind.scm, env/command-level.scm set-dynamic-env! ; wind.scm get-dynamic-point ; wind.scm set-dynamic-point!)) ; wind.scm (define-interface enumerated-interface (export (define-enumeration :syntax) (enum :syntax) (enumerand->name :syntax) (name->enumerand :syntax))) (define :enumeration :syntax) (define-interface signals-interface (export error warn syntax-error call-error signal signal-condition make-condition)) (define-interface handle-interface (export ignore-errors report-errors-as-warnings with-handler)) (define-interface conditions-interface (export define-condition-type condition-predicate condition-stuff condition-type error? warning? syntax-error? call-error? read-error? interrupt? ;; Do these belong here?... not really. exception-arguments exception-reason exception-opcode exception? make-exception)) (define-interface wind-interface (export call-with-current-continuation dynamic-wind)) (define-interface i/o-interface (export current-input-port current-output-port close-output-port close-input-port ;; Added for scsh -dfisher and JMG;; $current-input-port $current-output-port $current-error-port $current-noise-port make-buffered-input-port-handler make-buffered-output-port-handler make-buffered-input-port make-buffered-output-port ;; end of additions. ;; char-ready? read-block write-block newline input-port-option ;read.scm output-port-option ;write.scm write-string ;write.scm initialize-i/o ;init.scm initialize-output-port-list! ;init.scm with-current-ports initialize-i/o-handlers! ;init.scm disclose-port current-error-port current-noise-port force-output ;xport.scm output-port-ready? input-port? output-port? silently make-null-output-port)) (define-interface i/o-internal-interface (export make-input-port make-output-port make-unbuffered-output-port make-port-handler port-handler-buffer-proc ; extended-ports default-buffer-size open-input-port? open-input-port-status make-input-port-closed! open-output-port? open-output-port-status make-output-port-closed! eof-object ; users will probably want this obtain-port-lock release-port-lock periodically-force-output! periodically-flushed-ports force-output-if-open really-force-output ; assumes port alread locked output-port-forcers ;root-scheduler.scm steal-port! ; JMG: for scsh fill-port-buffer! ; JMG: for read-delimited call-with-current-input-port call-with-current-output-port call-with-current-noise-port)) (define-interface channel-i/o-interface (export call-with-input-file call-with-output-file with-input-from-file with-output-to-file open-input-file open-output-file initialize-channel-i/o! ;scheduler waiting-for-i/o? ;scheduler steal-channel-port! ;command steal-channel! ;JMG: 3 For scsh. steal-port! channel-cell-ref input-channel->port ;usual-resumer posix output-channel->port ;usual-resumer posix input-channel+closer->port ;big/socket.scm output-channel+closer->port ;big/socket.scm ; call WAIT-FOR-CHANNEL with interrupts disabled wait-for-channel ;big/socket.scm port->channel ;posix force-channel-output-ports! ;posix )) (define-interface threads-interface (export thread? thread-name thread-uid ;for debugging spawn relinquish-timeslice sleep terminate-current-thread)) (define-interface threads-internal-interface (export make-thread thread-data set-thread-data! thread-continuation ;debugger thread-uid->thread ;expensive! thread-scheduler set-thread-scheduler! set-thread-arguments! current-thread make-thread-queue thread-queue-empty? enqueue-thread! dequeue-thread! remove-thread-from-queue! event-pending? get-next-event! schedule-event (event-type :syntax) run running? block make-ready spawn-on-scheduler spawn-on-root wait upcall propogate-upcall interrupt-thread kill-thread! wake-some-threads all-threads ; for command-levels with-threads)) ; rts/init.scm (define-interface scheduler-interface (export run-threads run-threads-with-housekeeper round-robin-event-handler make-counter ; for thread counts counter-value increment-counter! decrement-counter!)) (define-interface queues-interface (export make-queue enqueue! dequeue! queue-empty? queue? queue->list queue-length delete-from-queue!)) (define-interface exceptions-interface (export define-exception-handler initialize-exceptions! extend-opcode! signal-exception continuation-preview)) ;env/debug.scm (define-interface interrupts-interface (export initialize-interrupts! ;init.scm all-interrupts no-interrupts ;reset-timer-interrupts! set-interrupt-handler! interrupt? ;set-timer-interrupt! schedule-interrupt set-enabled-interrupts! ;command.scm enabled-interrupts enable-interrupts! disable-interrupts! with-interrupts-allowed with-interrupts-inhibited call-after-gc! call-before-heap-overflow! (interrupt :syntax))) (define-interface sigevents-interface (export rts-next-sigevent rts-next-sigevent/no-wait most-recent-sigevent sigevent? sigevent-type schedule-timer-interrupt!)) (define-interface sigevents-internal-interface (export waiting-for-sigevent? initialize-sigevents!)) (define-interface writing-interface (export write display display-type-name recurring-write)) (define-interface reading-interface (export read define-sharp-macro ;command.scm reading-error gobble-line)) ; Level 2: the harder stuff. ; Various primitives get numeric types and promoted to n-ary at this point. (define-interface scheme-level-2-adds-interface (export (char-ready? (proc (&opt :input-port) :boolean)) call-with-current-continuation call-with-input-file call-with-output-file current-input-port current-output-port dynamic-wind ;New in R5RS close-input-port close-output-port open-input-file open-output-file with-input-from-file with-output-to-file number->string string->number newline display write read)) (define-interface scheme-level-2-interface (compound-interface scheme-level-2-adds-interface scheme-level-1-interface)) (define-interface scheme-adds-interface (export eval load interaction-environment scheme-report-environment null-environment)) (define-interface scheme-interface (compound-interface scheme-adds-interface scheme-level-2-interface)) (define-interface continuations-interface (export continuation-arg continuation-arg-count continuation-cont continuation-env continuation-pc continuation-template continuation-parent continuation? :continuation exception-continuation? exception-continuation-exception)) (define-interface templates-interface (export make-template template-code template-info template-length template-ref template-overhead set-template-code! set-template-info! template-set! template?)) (define-interface weak-interface (export weak-pointer? ;disclosers.scm weak-pointer-ref make-weak-pointer make-population add-to-population! population->list walk-population)) (define-interface filenames-interface (export namestring *scheme-file-type* *load-file-type* file-name-directory file-name-nondirectory translate set-translation! translations)) ; Things for the compiler. (define-interface general-tables-interface (export make-table make-string-table make-symbol-table make-integer-table make-table-maker table? table-ref table-set! table-walk make-table-immutable! string-hash default-table-hash-function)) ;---------------- ; Beginning of compiler interfaces (define-interface usual-macros-interface (export usual-transform)) (define-interface meta-types-interface (export same-type? subtype? meet? join-type meet-type sexp->type type->sexp rail-type->sexp syntax-type any-values-type any-arguments-type value-type error-type make-some-values-type empty-rail-type rail-type make-optional-type make-rest-type empty-rail-type? rest-type? head-type tail-type procedure-type procedure-type-domain procedure-type-codomain restrictive? procedure-type? fixed-arity-procedure-type? procedure-type-argument-types procedure-type-arity any-procedure-type (proc :syntax) (some-values :syntax) boolean-type char-type null-type unspecific-type exact-integer-type integer-type rational-type real-type complex-type number-type exact-type inexact-type pair-type string-type symbol-type vector-type escape-type structure-type ;; Stuff moved back from syntactic - why was it moved there? variable-type variable-type? variable-value-type usual-variable-type undeclared-type compatible-types?)) (define-interface names-interface (export name? name->symbol make-name-generator generate-name ;qualified->name in opt/inline.scm generated? generated-symbol generated-token generated-env generated-parent-name generated-uid make-name-table qualified? qualified-parent-name qualified-symbol name->qualified desyntaxify )) (define-interface transforms-interface (export make-transform maybe-apply-macro-transform apply-inline-transform transform? transform-type transform-env ; These are used to reify transforms. transform-aux-names transform-source transform-id)) (define-interface bindings-interface (export binding? make-binding binding-place set-binding-place! ;for package mutation, used in package.scm binding-static binding-type binding-path add-path clobber-binding! maybe-fix-place! forget-integration impose-type same-denotation? )) ;---------------- ; Syntactic interfaces (define-interface compiler-envs-interface (export make-compiler-env ; re-exported by syntactic lookup bind1 bind bindrec bind-source-file-name ; re-exported by syntactic source-file-name environment-macro-eval environment-define! extract-package-from-environment)) ; temporary (define-interface syntactic-interface (export expand expand-form scan-forms expand-scanned-form syntax? make-compiler-env bind-source-file-name)) (define-interface nodes-interface (export make-node node? node-operator node-operator-id node-form node-ref node-set! node-predicate make-similar-node force-node schemify get-operator make-operator-table operator-name operator-nargs operator-table-ref operator-define! operator-lookup operator-type operator-uid operator? operators-table ;config.scm comp-package.scm )) ;---------------- ; Compiler interfaces (define-interface segments-interface (export attach-label byte-limit two-byte-limit high-byte low-byte empty-segment instruction instruction-using-label instruction-with-literal instruction-with-location template computed-goto-instruction make-label note-environment note-source-code segment->template ;plan segment-size sequentially ;; state debug-flag-names ; keep and flush commands debug-flag-accessor debug-flag-modifier debug-data-table get-debug-data with-fresh-compiler-state ;for linker keep-source-code? ;for bcomp )) (define-interface compiler-interface (export compile-forms make-startup-procedure ;link/link.scm set-type-check?! ; for timings define-compilator ;assem.scm deliver-value ;assem.scm )) (define-interface primops-interface (export define-compiler-primitive primop? primop-name primop-type primop-closed primop-compilator get-primop walk-primops ;comp-package.scm )) (define-interface debug-data-interface (export debug-data-env-maps debug-data-name debug-data-parent debug-data-pc-in-parent debug-data-source debug-data-uid debug-data? set-debug-data-source! set-debug-data-env-maps! make-debug-data)) ;---------------- ; Module interfaces ; Interfaces. (define-interface interfaces-interface (export make-compound-interface make-simple-interface note-reference-to-interface! interface-ref interface? interface-clients for-each-declaration note-interface-name!)) ; Packages. (define-interface packages-interface (export make-package make-simple-package ;start.scm make-structure package-define! package-lookup package? ;command.scm structure-lookup ;env.scm generic-lookup ;inline.scm structure-interface ;config.scm package->environment link! structure? package-uid ;reifier make-new-location ;ctop.scm structure-package note-structure-name! (:package :type) (:structure :type))) ;for (define-method ...)'s (define-interface packages-internal-interface (export package-loaded? ;env/load-package.scm set-package-loaded?! ;env/load-package.scm package-name flush-location-names package-name-table ;debuginfo location-info-table ;debuginfo, disclosers package-unstable? ;env/pacman.scm package-integrate? ;env/debug.scm package-add-static! ;opt/analyze.scm package-refine-type! ;opt/usage.scm ;; For scanner for-each-export package-accesses package-clauses package-file-name package-opens set-package-integrate?! structure-name ;; For package mutation for-each-definition set-package-opens! set-structure-interface! set-package-opens-thunk! structure-clients package-opens-thunk package-opens-really package-undefineds package-undefined-but-assigneds package-note-caching! structure-interface-really make-new-location $get-location set-package-get-location! initialize-structure! initialize-package! location-for-reference package-cached package-definitions package-clients)) (define-interface scan-package-interface (export collect-packages package-source package-optimizer-names check-structure)) (define-interface optimizer-interface (export set-optimizer! get-optimizer)) (define-interface undefined-interface (export noting-undefined-variables $note-undefined ;env/command.scm )) ;---------------- ; Inlining (define-interface inline-interface (export make-inline-transform inline-transform ;bcomp/for-reify.scm qualified->name)) (define-interface usages-interface (export find-usages find-node-usages usage-name-node usage-reference-count usage-operator-count usage-assignment-count)) ; End of compiler interfaces ;---------------- (define-interface environments-interface ;cheesy (export *structure-ref environment-define! environment-ref environment-set! interaction-environment make-reflective-tower scheme-report-environment null-environment set-interaction-environment! set-scheme-report-environment! with-interaction-environment set-reflective-tower-maker!)) (define-interface defpackage-interface (export ((def ;Formerly define-structure define-interface ;Formerly define-signature define-structures ;Formerly define-package define-structure define-module define-syntax define-reflective-tower-maker export-reflective-tower-maker compound-interface export structure structures let ; New begin ; mostly for macros define ; for compatibility? a-package) ; cf. env/init-defpackage.scm :syntax) values interface-of set-verify-later!)) (define-interface types-interface (export ((:syntax :values :arguments :value) :type) (procedure (proc (:type :type) :type)) ; (procedure T1 T2) (proc :syntax) ; (proc (T1 ... Tn) T) (some-values :syntax) ; (some-values T1 ... Tn) ;JMG added it again ((:boolean :char :number :complex :real :rational :integer :exact-integer :null :unspecific :pair :string :symbol :vector :procedure :input-port :output-port :error :escape) :type) (:structure :type) :type)) ;Holy stratification, Batman! (define-interface evaluation-interface (export eval load load-into eval-from-file ; eval-scanned-forms )) ; VM architecture (define-interface architecture-interface (export (enum :syntax) ;So you don't have to remember to open ENUMERATED (enumerand->name :syntax) (name->enumerand :syntax) bits-used-per-byte byte-limit (exception :enumeration) exception-count (interrupt :enumeration) interrupt-count (memory-status-option :enumeration) memory-status-option-count (op :enumeration) op-count opcode-arg-specs (stob :enumeration) stob-count stob-data (channel-status-option :enumeration) (time-option :enumeration) time-option-count (port-status-options :enumeration) (current-port-marker :syntax) maximum-stack-args two-byte-nargs-protocol two-byte-nargs+list-protocol args+nargs-protocol big-stack-protocol nary-dispatch-protocol default-stack-space environment-stack-size continuation-stack-size available-stack-space)) (define-interface display-conditions-interface (export display-condition ;command.scm &disclose-condition ;env/disclosers.scm limited-write)) ; Bindings needed by the form composed by REIFY-STRUCTURES. (define-interface for-reification-interface (export operator simple-interface package transform primop ;; From usual-macros usual-transform ;; From inline inline-transform ;; From packages package-define-static! ;; From primops make-structure )) ;(define-interface command-interface ...) -- moved to more-interfaces.scm