#!../src/ikarus -b ikarus.boot --r6rs-script ;;; Ikarus Scheme -- A compiler for R6RS Scheme. ;;; Copyright (C) 2006,2007,2008 Abdulaziz Ghuloum ;;; ;;; This program is free software: you can redistribute it and/or modify ;;; it under the terms of the GNU General Public License version 3 as ;;; published by the Free Software Foundation. ;;; ;;; This program is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;;; General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with this program. If not, see . ;;; vim:syntax=scheme (import (only (ikarus) import)) (import (except (ikarus) optimize-level assembler-output scc-letrec optimize-cp)) (import (ikarus.compiler)) (import (except (psyntax system $bootstrap) eval-core current-primitive-locations compile-core-expr-to-port)) (import (ikarus.compiler)) ; just for fun (define scheme-library-files ;;; Listed in the order in which they're loaded. ;;; ;;; Loading of the boot file may segfault if a library is ;;; loaded before its dependencies are loaded first. ;;; ;;; reason is that the base libraries are not a hierarchy of ;;; dependencies but rather an eco system in which every ;;; part depends on the other. ;;; ;;; For example, the printer may call error if it finds ;;; an error (e.g. "not an output port"), while the error ;;; procedure may call the printer to display the message. ;;; This works fine as long as error does not itself cause ;;; an error (which may lead to the infamous Error: Error: ;;; Error: Error: Error: Error: Error: Error: Error: ...). ;;; '( "ikarus.singular-objects.ss" "ikarus.handlers.ss" "ikarus.multiple-values.ss" "ikarus.control.ss" "ikarus.exceptions.ss" "ikarus.collect.ss" "ikarus.apply.ss" "ikarus.predicates.ss" "ikarus.pairs.ss" "ikarus.lists.ss" "ikarus.fixnums.ss" "ikarus.chars.ss" "ikarus.structs.ss" "ikarus.records.procedural.ss" "ikarus.strings.ss" "ikarus.unicode-conversion.ss" "ikarus.date-string.ss" "ikarus.symbols.ss" "ikarus.vectors.ss" "ikarus.unicode-data.ss" "ikarus.numerics.ss" "ikarus.conditions.ss" "ikarus.guardians.ss" "ikarus.command-line.ss" "ikarus.codecs.ss" "ikarus.bytevectors.ss" "ikarus.posix.ss" "ikarus.io.ss" "ikarus.hash-tables.ss" "ikarus.pretty-formats.ss" "ikarus.writer.ss" "ikarus.reader.ss" "ikarus.reader.annotated.ss" "ikarus.code-objects.ss" "ikarus.intel-assembler.ss" "ikarus.trace.ss" "ikarus.fasl.write.ss" ;;; HERE "ikarus.fasl.ss" "ikarus.compiler.ss" "psyntax.compat.ss" "psyntax.library-manager.ss" "psyntax.internal.ss" "psyntax.config.ss" "psyntax.builders.ss" "psyntax.expander.ss" "ikarus.load.ss" "ikarus.pretty-print.ss" "ikarus.cafe.ss" "ikarus.timer.ss" "ikarus.time-and-date.ss" "ikarus.sort.ss" "ikarus.promises.ss" "ikarus.enumerations.ss" "ikarus.not-yet-implemented.ss" "ikarus.main.ss" )) (define ikarus-system-macros '([define (define)] [define-syntax (define-syntax)] [module (module)] [library (library)] [begin (begin)] [import (import)] [set! (set!)] [let-syntax (let-syntax)] [letrec-syntax (letrec-syntax)] [foreign-call (core-macro . foreign-call)] [quote (core-macro . quote)] [syntax-case (core-macro . syntax-case)] [syntax (core-macro . syntax)] [lambda (core-macro . lambda)] [case-lambda (core-macro . case-lambda)] [type-descriptor (core-macro . type-descriptor)] [letrec (core-macro . letrec)] [letrec* (core-macro . letrec*)] [if (core-macro . if)] [when (core-macro . when)] [unless (core-macro . unless)] [parameterize (core-macro . parameterize)] [case (core-macro . case)] [fluid-let-syntax (core-macro . fluid-let-syntax)] [record-type-descriptor (core-macro . record-type-descriptor)] [record-constructor-descriptor (core-macro . record-constructor-descriptor)] [let-values (macro . let-values)] [let*-values (macro . let*-values)] [define-struct (macro . define-struct)] [include (macro . include)] [include-into (macro . include-into)] [syntax-rules (macro . syntax-rules)] [quasiquote (macro . quasiquote)] [quasisyntax (macro . quasisyntax)] [with-syntax (macro . with-syntax)] [identifier-syntax (macro . identifier-syntax)] [let (macro . let)] [let* (macro . let*)] [cond (macro . cond)] [do (macro . do)] [and (macro . and)] [or (macro . or)] [time (macro . time)] [delay (macro . delay)] [endianness (macro . endianness)] [assert (macro . assert)] [... (macro . ...)] [=> (macro . =>)] [else (macro . else)] [_ (macro . _)] [unquote (macro . unquote)] [unquote-splicing (macro . unquote-splicing)] [unsyntax (macro . unsyntax)] [unsyntax-splicing (macro . unsyntax-splicing)] [trace-lambda (macro . trace-lambda)] [trace-define (macro . trace-define)] [trace-define-syntax (macro . trace-define-syntax)] [guard (macro . guard)] [eol-style (macro . eol-style)] [buffer-mode (macro . buffer-mode)] [file-options (macro . file-options)] [error-handling-mode (macro . error-handling-mode)] [fields (macro . fields)] [mutable (macro . mutable)] [immutable (macro . immutable)] [parent (macro . parent)] [protocol (macro . protocol)] [sealed (macro . sealed)] [opaque (macro . opaque )] [nongenerative (macro . nongenerative)] [parent-rtd (macro . parent-rtd)] [define-record-type (macro . define-record-type)] [define-enumeration (macro . define-enumeration)] [define-condition-type (macro . define-condition-type)] [&condition ($core-rtd . (&condition-rtd &condition-rcd))] [&message ($core-rtd . (&message-rtd &message-rcd))] [&warning ($core-rtd . (&warning-rtd &warning-rcd ))] [&serious ($core-rtd . (&serious-rtd &serious-rcd))] [&error ($core-rtd . (&error-rtd &error-rcd))] [&violation ($core-rtd . (&violation-rtd &violation-rcd ))] [&assertion ($core-rtd . (&assertion-rtd &assertion-rcd ))] [&irritants ($core-rtd . (&irritants-rtd &irritants-rcd))] [&who ($core-rtd . (&who-rtd &who-rcd ))] [&non-continuable ($core-rtd . (&non-continuable-rtd &non-continuable-rcd))] [&implementation-restriction ($core-rtd . (&implementation-restriction-rtd &implementation-restriction-rcd))] [&lexical ($core-rtd . (&lexical-rtd &lexical-rcd ))] [&syntax ($core-rtd . (&syntax-rtd &syntax-rcd ))] [&undefined ($core-rtd . (&undefined-rtd &undefined-rcd))] [&i/o ($core-rtd . (&i/o-rtd &i/o-rcd ))] [&i/o-read ($core-rtd . (&i/o-read-rtd &i/o-read-rcd ))] [&i/o-write ($core-rtd . (&i/o-write-rtd &i/o-write-rcd))] [&i/o-invalid-position ($core-rtd . (&i/o-invalid-position-rtd &i/o-invalid-position-rcd ))] [&i/o-filename ($core-rtd . (&i/o-filename-rtd &i/o-filename-rcd))] [&i/o-file-protection ($core-rtd . (&i/o-file-protection-rtd &i/o-file-protection-rcd))] [&i/o-file-is-read-only ($core-rtd . (&i/o-file-is-read-only-rtd &i/o-file-is-read-only-rcd ))] [&i/o-file-already-exists ($core-rtd . (&i/o-file-already-exists-rtd &i/o-file-already-exists-rcd))] [&i/o-file-does-not-exist ($core-rtd . (&i/o-file-does-not-exist-rtd &i/o-file-does-not-exist-rcd))] [&i/o-port ($core-rtd . (&i/o-port-rtd &i/o-port-rcd))] [&i/o-decoding ($core-rtd . (&i/o-decoding-rtd &i/o-decoding-rcd))] [&i/o-encoding ($core-rtd . (&i/o-encoding-rtd &i/o-encoding-rcd))] [&no-infinities ($core-rtd . (&no-infinities-rtd &no-infinities-rcd ))] [&no-nans ($core-rtd . (&no-nans-rtd &no-nans-rcd))] [&interrupted ($core-rtd . (&interrupted-rtd &interrupted-rcd))] )) (define library-legend ;; abbr. name visible? required? '([i (ikarus) #t #t] [cm (chez modules) #t #t] [symbols (ikarus symbols) #t #t] [parameters (ikarus parameters) #t #t] [r (rnrs) #t #t] [r5 (rnrs r5rs) #t #t] [ct (rnrs control) #t #t] [ev (rnrs eval) #t #t] [mp (rnrs mutable-pairs) #t #t] [ms (rnrs mutable-strings) #t #t] [pr (rnrs programs) #t #t] [sc (rnrs syntax-case) #t #t] [fi (rnrs files) #t #t] [sr (rnrs sorting) #t #t] [ba (rnrs base) #t #t] [ls (rnrs lists) #t #t] [is (rnrs io simple) #t #t] [bv (rnrs bytevectors) #t #t] [uc (rnrs unicode) #t #t] [ex (rnrs exceptions) #t #t] [bw (rnrs arithmetic bitwise) #t #t] [fx (rnrs arithmetic fixnums) #t #t] [fl (rnrs arithmetic flonums) #t #t] [ht (rnrs hashtables) #t #t] [ip (rnrs io ports) #t #t] [en (rnrs enums) #t #t] [co (rnrs conditions) #t #t] [ri (rnrs records inspection) #t #t] [rp (rnrs records procedural) #t #t] [rs (rnrs records syntactic) #t #t] [$pairs (ikarus system $pairs) #f #t] [$lists (ikarus system $lists) #f #t] [$chars (ikarus system $chars) #f #t] [$strings (ikarus system $strings) #f #t] [$vectors (ikarus system $vectors) #f #t] [$flonums (ikarus system $flonums) #f #t] [$bignums (ikarus system $bignums) #f #t] [$bytes (ikarus system $bytevectors) #f #t] [$transc (ikarus system $transcoders) #f #t] [$fx (ikarus system $fx) #f #t] [$rat (ikarus system $ratnums) #f #t] [$comp (ikarus system $compnums) #f #t] [$symbols (ikarus system $symbols) #f #t] [$structs (ikarus system $structs) #f #t] ;[$ports (ikarus system $ports) #f #t] [$codes (ikarus system $codes) #f #t] [$tcbuckets (ikarus system $tcbuckets) #f #t] [$arg-list (ikarus system $arg-list) #f #t] [$stack (ikarus system $stack) #f #t] [$interrupts (ikarus system $interrupts) #f #t] [$io (ikarus system $io) #f #t] [interrupts (ikarus system interrupts) #f #t] [$all (psyntax system $all) #f #t] [$boot (psyntax system $bootstrap) #f #t] [ne (psyntax null-environment-5) #f #f] [se (psyntax scheme-report-environment-5) #f #f] )) (define identifier->library-map '( [import i] [foreign-call i] [type-descriptor i] [parameterize i parameters] [define-struct i] [include i] [include-into i] [time i] [trace-lambda i] [trace-define i] [trace-define-syntax i] [make-list i] [last-pair i] [bwp-object? i] [weak-cons i] [weak-pair? i] [uuid i] [date-string i] [andmap i] [ormap i] [fx< i] [fx<= i] [fx> i] [fx>= i] [fx= i] [fxadd1 i] [fxsub1 i] [fxquotient i] [fxremainder i] [fxmodulo i] [fxsll i] [fxsra i] [sra i] [sll i] [fxlogand i] [fxlogxor i] [fxlogor i] [fxlognot i] [fixnum->string i] [string->flonum i] [add1 i] [sub1 i] [bignum? i] [ratnum? i] [compnum? i] [cflonum? i] [flonum-parts i] [flonum-bytes i] [quotient+remainder i] [flonum->string i] [random i] [gensym? i symbols] [getprop i symbols] [putprop i symbols] [remprop i symbols] [property-list i symbols] [gensym->unique-string i symbols] [symbol-bound? i symbols] [top-level-value i symbols] [reset-symbol-proc! i symbols] [make-guardian i] [port-mode i] [set-port-mode! i] [with-input-from-string i] [open-output-string i] [open-output-bytevector i] [get-output-string i] [get-output-bytevector i] [with-output-to-string i] ; [with-output-to-bytevector i] [console-input-port i] [console-error-port i] [console-output-port i] [reset-input-port! i] [reset-output-port! i] [read-token i] [printf i] [fprintf i] [format i] [comment-handler i] [print-gensym i symbols] [print-graph i] [print-unicode i] [unicode-printable-char? i] [gensym-count i symbols] [gensym-prefix i symbols] [make-parameter i parameters] [call/cf i] [print-error i] [strerror i] [interrupt-handler i] [engine-handler i] [assembler-output i] [new-cafe i] [expand i] [environment? i] [time-it i] [verbose-timer i] [current-time i] [time? i] [time-second i] [time-gmt-offset i] [time-nanosecond i] [command-line-arguments i] [set-rtd-printer! i] [struct? i] [make-struct-type i] [struct-type-name i] [struct-type-symbol i] [struct-type-field-names i] [struct-field-accessor i] [struct-length i] [struct-ref i] [struct-printer i] [struct-name i] [struct-type-descriptor i] [code? i] [immediate? i] [pointer-value i] [system i] [process i] [process-nonblocking i] [waitpid i] [installed-libraries i] [library-path i] [library-extensions i] [current-primitive-locations $boot] [boot-library-expand $boot] [current-library-collection $boot] [library-name $boot] [find-library-by-name $boot] [$car $pairs] [$cdr $pairs] [$set-car! $pairs] [$set-cdr! $pairs] [$memq $lists] [$memv $lists] [$char? $chars] [$char= $chars] [$char< $chars] [$char> $chars] [$char<= $chars] [$char>= $chars] [$char->fixnum $chars] [$fixnum->char $chars] [$make-string $strings] [$string-ref $strings] [$string-set! $strings] [$string-length $strings] [$make-bytevector $bytes] [$bytevector-length $bytes] [$bytevector-s8-ref $bytes] [$bytevector-u8-ref $bytes] [$bytevector-set! $bytes] [$bytevector-ieee-double-native-ref $bytes] [$bytevector-ieee-double-native-set! $bytes] [$bytevector-ieee-double-nonnative-ref $bytes] [$bytevector-ieee-double-nonnative-set! $bytes] [$bytevector-ieee-single-native-ref $bytes] [$bytevector-ieee-single-native-set! $bytes] [$bytevector-ieee-single-nonnative-ref $bytes] [$bytevector-ieee-single-nonnative-set! $bytes] [$flonum-u8-ref $flonums] [$make-flonum $flonums] [$flonum-set! $flonums] [$flonum-signed-biased-exponent $flonums] [$flonum-rational? $flonums] [$flonum-integer? $flonums] [$fl+ $flonums] [$fl- $flonums] [$fl* $flonums] [$fl/ $flonums] [$fl= $flonums] [$fl< $flonums] [$fl<= $flonums] [$fl> $flonums] [$fl>= $flonums] ;[$flround $flonums] [$fixnum->flonum $flonums] [$flonum-sbe $flonums] [$make-bignum $bignums] [$bignum-positive? $bignums] [$bignum-size $bignums] [$bignum-byte-ref $bignums] [$bignum-byte-set! $bignums] [$make-ratnum $rat] [$ratnum-n $rat] [$ratnum-d $rat] [$make-compnum $comp] [$compnum-real $comp] [$compnum-imag $comp] [$make-cflonum $comp] [$cflonum-real $comp] [$cflonum-imag $comp] [$make-vector $vectors] [$vector-length $vectors] [$vector-ref $vectors] [$vector-set! $vectors] [$fxzero? $fx] [$fxadd1 $fx] [$fxsub1 $fx] [$fx>= $fx] [$fx<= $fx] [$fx> $fx] [$fx< $fx] [$fx= $fx] [$fxsll $fx] [$fxsra $fx] [$fxquotient $fx] [$fxmodulo $fx] [$fxlogxor $fx] [$fxlogor $fx] [$fxlognot $fx] [$fxlogand $fx] [$fx+ $fx] [$fx* $fx] [$fx- $fx] [$fxinthash $fx] [$make-symbol $symbols] [$symbol-unique-string $symbols] [$symbol-value $symbols] [$symbol-string $symbols] [$symbol-plist $symbols] [$set-symbol-value! $symbols] [$set-symbol-proc! $symbols] [$set-symbol-string! $symbols] [$set-symbol-unique-string! $symbols] [$set-symbol-plist! $symbols] [$init-symbol-value! ] [$unbound-object? $symbols] ;;; [base-rtd $structs] [$struct-set! $structs] [$struct-ref $structs] [$struct-rtd $structs] [$struct $structs] [$make-struct $structs] [$struct? $structs] [$struct/rtd? $structs] ;;; [$closure-code $codes] [$code->closure $codes] [$code-reloc-vector $codes] [$code-freevars $codes] [$code-size $codes] [$code-annotation $codes] [$code-ref $codes] [$code-set! $codes] [$set-code-annotation! $codes] [procedure-annotation i] [$make-tcbucket $tcbuckets] [$tcbucket-key $tcbuckets] [$tcbucket-val $tcbuckets] [$tcbucket-next $tcbuckets] [$set-tcbucket-val! $tcbuckets] [$set-tcbucket-next! $tcbuckets] [$set-tcbucket-tconc! $tcbuckets] [$arg-list $arg-list] [$collect-key $arg-list] [$$apply $stack] [$fp-at-base $stack] [$primitive-call/cc $stack] [$frame->continuation $stack] [$current-frame $stack] [$seal-frame-and-call $stack] [$make-call-with-values-procedure $stack] [$make-values-procedure $stack] [$interrupted? $interrupts] [$unset-interrupted! $interrupts] [$swap-engine-counter! $interrupts] [interrupted-condition? interrupts] [make-interrupted-condition interrupts] [$apply-nonprocedure-error-handler ] [$incorrect-args-error-handler ] [$multiple-values-error ] [$debug ] [$underflow-misaligned-error ] [top-level-value-error ] [car-error ] [cdr-error ] [fxadd1-error ] [fxsub1-error ] [cadr-error ] [fx+-type-error ] [fx+-types-error ] [fx+-overflow-error ] [$do-event ] [do-overflow ] [do-overflow-words ] [do-vararg-overflow ] [collect i] [collect-key i] [do-stack-overflow ] [make-promise ] [make-traced-procedure i] [error@fx+ ] [error@fxarithmetic-shift-left ] [error@fx* ] [error@fx- ] [error@add1 ] [error@sub1 ] [error@fxadd1 ] [error@fxsub1 ] [fasl-write i] [fasl-read i] [lambda i r ba se ne] [and i r ba se ne] [begin i r ba se ne] [case i r ba se ne] [cond i r ba se ne] [define i r ba se ne] [define-syntax i r ba se ne] [identifier-syntax i r ba] [if i r ba se ne] [let i r ba se ne] [let* i r ba se ne] [let*-values i r ba] [let-syntax i r ba se ne] [let-values i r ba] [fluid-let-syntax i] [letrec i r ba se ne] [letrec* i r ba] [letrec-syntax i r ba se ne] [or i r ba se ne] [quasiquote i r ba se ne] [quote i r ba se ne] [set! i r ba se ne] [syntax-rules i r ba se ne] [unquote i r ba se ne] [unquote-splicing i r ba se ne] [< i r ba se] [<= i r ba se] [= i r ba se] [> i r ba se] [>= i r ba se] [+ i r ba se] [- i r ba se] [* i r ba se] [/ i r ba se] [abs i r ba se] [acos i r ba se] [angle i r ba se] [append i r ba se] [apply i r ba se] [asin i r ba se] [assert i r ba] [assertion-violation i r ba] [atan i r ba se] [boolean=? i r ba] [boolean? i r ba se] [car i r ba se] [cdr i r ba se] [caar i r ba se] [cadr i r ba se] [cdar i r ba se] [cddr i r ba se] [caaar i r ba se] [caadr i r ba se] [cadar i r ba se] [caddr i r ba se] [cdaar i r ba se] [cdadr i r ba se] [cddar i r ba se] [cdddr i r ba se] [caaaar i r ba se] [caaadr i r ba se] [caadar i r ba se] [caaddr i r ba se] [cadaar i r ba se] [cadadr i r ba se] [caddar i r ba se] [cadddr i r ba se] [cdaaar i r ba se] [cdaadr i r ba se] [cdadar i r ba se] [cdaddr i r ba se] [cddaar i r ba se] [cddadr i r ba se] [cdddar i r ba se] [cddddr i r ba se] [call-with-current-continuation i r ba se] [call/cc i r ba] [call-with-values i r ba se] [ceiling i r ba se] [char->integer i r ba se] [char<=? i r ba se] [char=? i r ba se] [char>? i r ba se] [char? i r ba se] [complex? i r ba se] [cons i r ba se] [cos i r ba se] [denominator i r ba se] [div i r ba] [mod i r ba] [div-and-mod i r ba] [div0 i r ba] [mod0 i r ba] [div0-and-mod0 i r ba] [dynamic-wind i r ba se] [eq? i r ba se] [equal? i r ba se] [eqv? i r ba se] [error i r ba] [die i] [even? i r ba se] [exact i r ba] [exact-integer-sqrt i r ba] [exact? i r ba se] [exp i r ba se] [expt i r ba se] [finite? i r ba] [floor i r ba se] [for-each i r ba se] [gcd i r ba se] [imag-part i r ba se] [inexact i r ba] [inexact? i r ba se] [infinite? i r ba] [integer->char i r ba se] [integer-valued? i r ba] [integer? i r ba se] [lcm i r ba se] [length i r ba se] [list i r ba se] [list->string i r ba se] [list->vector i r ba se] [list-ref i r ba se] [list-tail i r ba se] [list? i r ba se] [log i r ba se] [magnitude i r ba se] [make-polar i r ba se] [make-rectangular i r ba se] [$make-rectangular $comp] [make-string i r ba se] [make-vector i r ba se] [map i r ba se] [max i r ba se] [min i r ba se] [nan? i r ba] [negative? i r ba se] [not i r ba se] [null? i r ba se] [number->string i r ba se] [number? i r ba se] [numerator i r ba se] [odd? i r ba se] [pair? i r ba se] [positive? i r ba se] [procedure? i r ba se] [rational-valued? i r ba] [rational? i r ba se] [rationalize i r ba se] [real-part i r ba se] [real-valued? i r ba] [real? i r ba se] [reverse i r ba se] [round i r ba se] [sin i r ba se] [sqrt i r ba se] [string i r ba se] [string->list i r ba se] [string->number i r ba se] [string->symbol i symbols r ba se] [string-append i r ba se] [string-copy i r ba se] [string-for-each i r ba] [string-length i r ba se] [string-ref i r ba se] [string<=? i r ba se] [string=? i r ba se] [string>? i r ba se] [string? i r ba se] [substring i r ba se] [symbol->string i symbols r ba se] [symbol=? i symbols r ba] [symbol? i symbols r ba se] [tan i r ba se] [truncate i r ba se] [values i r ba se] [vector i r ba se] [vector->list i r ba se] [vector-fill! i r ba se] [vector-for-each i r ba] [vector-length i r ba se] [vector-map i r ba] [vector-ref i r ba se] [vector-set! i r ba se] [vector? i r ba se] [zero? i r ba se] [... i ne r ba sc se] [=> i ne r ba ex se] [_ i ne r ba sc] [else i ne r ba ex se] [bitwise-arithmetic-shift i r bw] [bitwise-arithmetic-shift-left i r bw] [bitwise-arithmetic-shift-right i r bw] [bitwise-not i r bw] [bitwise-and i r bw] [bitwise-ior i r bw] [bitwise-xor i r bw] [bitwise-bit-count i r bw] [bitwise-bit-field i r bw] [bitwise-bit-set? i r bw] [bitwise-copy-bit i r bw] [bitwise-copy-bit-field i r bw] [bitwise-first-bit-set i r bw] [bitwise-if i r bw] [bitwise-length i r bw] [bitwise-reverse-bit-field i r bw] [bitwise-rotate-bit-field i r bw] [fixnum? i r fx] [fixnum-width i r fx] [least-fixnum i r fx] [greatest-fixnum i r fx] [fx* i r fx] [fx*/carry i r fx] [fx+ i r fx] [fx+/carry i r fx] [fx- i r fx] [fx-/carry i r fx] [fx<=? i r fx] [fx=? i r fx] [fx>? i r fx] [fxand i r fx] [fxarithmetic-shift i r fx] [fxarithmetic-shift-left i r fx] [fxarithmetic-shift-right i r fx] [fxbit-count i r fx] [fxbit-field i r fx] [fxbit-set? i r fx] [fxcopy-bit i r fx] [fxcopy-bit-field i r fx] [fxdiv i r fx] [fxdiv-and-mod i r fx] [fxdiv0 i r fx] [fxdiv0-and-mod0 i r fx] [fxeven? i r fx] [fxfirst-bit-set i r fx] [fxif i r fx] [fxior i r fx] [fxlength i r fx] [fxmax i r fx] [fxmin i r fx] [fxmod i r fx] [fxmod0 i r fx] [fxnegative? i r fx] [fxnot i r fx] [fxodd? i r fx] [fxpositive? i r fx] [fxreverse-bit-field i r fx] [fxrotate-bit-field i r fx] [fxxor i r fx] [fxzero? i r fx] [fixnum->flonum i r fl] [fl* i r fl] [fl+ i r fl] [fl- i r fl] [fl/ i r fl] [fl<=? i r fl] [fl=? i r fl] [fl>? i r fl] [flabs i r fl] [flacos i r fl] [flasin i r fl] [flatan i r fl] [flceiling i r fl] [flcos i r fl] [fldenominator i r fl] [fldiv i r fl] [fldiv-and-mod i r fl] [fldiv0 i r fl] [fldiv0-and-mod0 i r fl] [fleven? i r fl] [flexp i r fl] [flexpt i r fl] [flfinite? i r fl] [flfloor i r fl] [flinfinite? i r fl] [flinteger? i r fl] [fllog i r fl] [flmax i r fl] [flmin i r fl] [flmod i r fl] [flmod0 i r fl] [flnan? i r fl] [flnegative? i r fl] [flnumerator i r fl] [flodd? i r fl] [flonum? i r fl] [flpositive? i r fl] [flround i r fl] [flsin i r fl] [flsqrt i r fl] [fltan i r fl] [fltruncate i r fl] [flzero? i r fl] [real->flonum i r fl] [make-no-infinities-violation i r fl] [make-no-nans-violation i r fl] [&no-infinities i r fl] [no-infinities-violation? i r fl] [&no-nans i r fl] [no-nans-violation? i r fl] [bytevector->sint-list i r bv] [bytevector->u8-list i r bv] [bytevector->uint-list i r bv] [bytevector-copy i r bv] [string-copy! i] [bytevector-copy! i r bv] [bytevector-fill! i r bv] [bytevector-ieee-double-native-ref i r bv] [bytevector-ieee-double-native-set! i r bv] [bytevector-ieee-double-ref i r bv] [bytevector-ieee-double-set! i r bv] [bytevector-ieee-single-native-ref i r bv] [bytevector-ieee-single-native-set! i r bv] [bytevector-ieee-single-ref i r bv] [bytevector-ieee-single-set! i r bv] [bytevector-length i r bv] [bytevector-s16-native-ref i r bv] [bytevector-s16-native-set! i r bv] [bytevector-s16-ref i r bv] [bytevector-s16-set! i r bv] [bytevector-s32-native-ref i r bv] [bytevector-s32-native-set! i r bv] [bytevector-s32-ref i r bv] [bytevector-s32-set! i r bv] [bytevector-s64-native-ref i r bv] [bytevector-s64-native-set! i r bv] [bytevector-s64-ref i r bv] [bytevector-s64-set! i r bv] [bytevector-s8-ref i r bv] [bytevector-s8-set! i r bv] [bytevector-sint-ref i r bv] [bytevector-sint-set! i r bv] [bytevector-u16-native-ref i r bv] [bytevector-u16-native-set! i r bv] [bytevector-u16-ref i r bv] [bytevector-u16-set! i r bv] [bytevector-u32-native-ref i r bv] [bytevector-u32-native-set! i r bv] [bytevector-u32-ref i r bv] [bytevector-u32-set! i r bv] [bytevector-u64-native-ref i r bv] [bytevector-u64-native-set! i r bv] [bytevector-u64-ref i r bv] [bytevector-u64-set! i r bv] [bytevector-u8-ref i r bv] [bytevector-u8-set! i r bv] [bytevector-uint-ref i r bv] [bytevector-uint-set! i r bv] [bytevector=? i r bv] [bytevector? i r bv] [endianness i r bv] [native-endianness i r bv] [sint-list->bytevector i r bv] [string->utf16 i r bv] [string->utf32 i r bv] [string->utf8 i r bv] [u8-list->bytevector i r bv] [uint-list->bytevector i r bv] [utf8->string i r bv] [utf16->string i r bv] [utf32->string i r bv] [print-condition i] [condition? i r co] [&assertion i r co] [assertion-violation? i r co] [&condition i r co] [condition i r co] [condition-accessor i r co] [condition-irritants i r co] [condition-message i r co] [condition-predicate i r co] [condition-who i r co] [define-condition-type i r co] [&error i r co] [error? i r co] [&implementation-restriction i r co] [implementation-restriction-violation? i r co] [&irritants i r co] [irritants-condition? i r co] [&lexical i r co] [lexical-violation? i r co] [make-assertion-violation i r co] [make-error i r co] [make-implementation-restriction-violation i r co] [make-irritants-condition i r co] [make-lexical-violation i r co] [make-message-condition i r co] [make-non-continuable-violation i r co] [make-serious-condition i r co] [make-syntax-violation i r co] [make-undefined-violation i r co] [make-violation i r co] [make-warning i r co] [make-who-condition i r co] [&message i r co] [message-condition? i r co] [&non-continuable i r co] [non-continuable-violation? i r co] [&serious i r co] [serious-condition? i r co] [simple-conditions i r co] [&syntax i r co] [syntax-violation i r co sc] [syntax-violation-form i r co] [syntax-violation-subform i r co] [syntax-violation? i r co] [&undefined i r co] [undefined-violation? i r co] [&violation i r co] [violation? i r co] [&warning i r co] [warning? i r co] [&who i r co] [who-condition? i r co] [case-lambda i r ct] [do i r ct se ne] [unless i r ct] [when i r ct] [define-enumeration i r en] [enum-set->list i r en] [enum-set-complement i r en] [enum-set-constructor i r en] [enum-set-difference i r en] [enum-set-indexer i r en] [enum-set-intersection i r en] [enum-set-member? i r en] [enum-set-projection i r en] [enum-set-subset? i r en] [enum-set-union i r en] [enum-set-universe i r en] [enum-set=? i r en] [make-enumeration i r en] [environment i ev] [eval i ev se] [raise i r ex] [raise-continuable i r ex] [with-exception-handler i r ex] [guard i r ex] [binary-port? i r ip] [buffer-mode i r ip] [buffer-mode? i r ip] [bytevector->string i r ip] [call-with-bytevector-output-port i r ip] [call-with-port i r ip] [call-with-string-output-port i r ip] [assoc i r ls se] [assp i r ls] [assq i r ls se] [assv i r ls se] [cons* i r ls] [filter i r ls] [find i r ls] [fold-left i r ls] [fold-right i r ls] [for-all i r ls] [exists i r ls] [member i r ls se] [memp i r ls] [memq i r ls se] [memv i r ls se] [partition i r ls] [remq i r ls] [remp i r ls] [remv i r ls] [remove i r ls] [set-car! i mp se] [set-cdr! i mp se] [string-set! i ms se] [string-fill! i ms se] [command-line i r pr] [exit i r pr] [delay i r5 se ne] [exact->inexact i r5 se] [force i r5 se] [inexact->exact i r5 se] [modulo i r5 se] [remainder i r5 se] [null-environment i r5 se] [quotient i r5 se] [scheme-report-environment i r5 se] [interaction-environment i r5 se] [close-port i r ip] [eol-style i r ip] [error-handling-mode i r ip] [file-options i r ip] [flush-output-port i r ip] [get-bytevector-all i r ip] [get-bytevector-n i r ip] [get-bytevector-n! i r ip] [get-bytevector-some i r ip] [get-char i r ip] [get-datum i r ip] [get-line i r ip] [get-string-all i r ip] [get-string-n i r ip] [get-string-n! i r ip] [get-u8 i r ip] [&i/o i r ip is fi] [&i/o-decoding i r ip] [i/o-decoding-error? i r ip] [&i/o-encoding i r ip] [i/o-encoding-error-char i r ip] [i/o-encoding-error? i r ip] [i/o-error-filename i r ip is fi] [i/o-error-port i r ip is fi] [i/o-error-position i r ip is fi] [i/o-error? i r ip is fi] [&i/o-file-already-exists i r ip is fi] [i/o-file-already-exists-error? i r ip is fi] [&i/o-file-does-not-exist i r ip is fi] [i/o-file-does-not-exist-error? i r ip is fi] [&i/o-file-is-read-only i r ip is fi] [i/o-file-is-read-only-error? i r ip is fi] [&i/o-file-protection i r ip is fi] [i/o-file-protection-error? i r ip is fi] [&i/o-filename i r ip is fi] [i/o-filename-error? i r ip is fi] [&i/o-invalid-position i r ip is fi] [i/o-invalid-position-error? i r ip is fi] [&i/o-port i r ip is fi] [i/o-port-error? i r ip is fi] [&i/o-read i r ip is fi] [i/o-read-error? i r ip is fi] [&i/o-write i r ip is fi] [i/o-write-error? i r ip is fi] [lookahead-char i r ip] [lookahead-u8 i r ip] [make-bytevector i r bv] [make-custom-binary-input-port i r ip] [make-custom-binary-output-port i r ip] [make-custom-textual-input-port i r ip] [make-custom-textual-output-port i r ip] [make-custom-binary-input/output-port i r ip] [make-custom-textual-input/output-port i r ip] [make-i/o-decoding-error i r ip] [make-i/o-encoding-error i r ip] [make-i/o-error i r ip is fi] [make-i/o-file-already-exists-error i r ip is fi] [make-i/o-file-does-not-exist-error i r ip is fi] [make-i/o-file-is-read-only-error i r ip is fi] [make-i/o-file-protection-error i r ip is fi] [make-i/o-filename-error i r ip is fi] [make-i/o-invalid-position-error i r ip is fi] [make-i/o-port-error i r ip is fi] [make-i/o-read-error i r ip is fi] [make-i/o-write-error i r ip is fi] [latin-1-codec i r ip] [make-transcoder i r ip] [native-eol-style i r ip] [native-transcoder i r ip] [transcoder? i] [open-bytevector-input-port i r ip] [open-bytevector-output-port i r ip] [open-file-input-port i r ip] [open-file-input/output-port i r ip] [open-file-output-port i r ip] [open-string-input-port i r ip] [open-string-output-port i r ip] [output-port-buffer-mode i r ip] [port-eof? i r ip] [port-has-port-position? i r ip] [port-has-set-port-position!? i r ip] [port-position i r ip] [port-transcoder i r ip] [port? i r ip] [put-bytevector i r ip] [put-char i r ip] [put-datum i r ip] [put-string i r ip] [put-u8 i r ip] [set-port-position! i r ip] [standard-error-port i r ip] [standard-input-port i r ip] [standard-output-port i r ip] [string->bytevector i r ip] [textual-port? i r ip] [transcoded-port i r ip] [transcoder-codec i r ip] [transcoder-eol-style i r ip] [transcoder-error-handling-mode i r ip] [utf-16-codec i r ip] [utf-8-codec i r ip] [input-port? i r is ip se] [output-port? i r is ip se] [current-input-port i r ip is se] [current-output-port i r ip is se] [current-error-port i r ip is] [eof-object i r ip is se] [eof-object? i r ip is se] [close-input-port i r is se] [close-output-port i r is se] [display i r is se] [newline i r is se] [open-input-file i r is se] [open-output-file i r is se] [peek-char i r is se] [read i r is se] [read-char i r is se] [with-input-from-file i r is se] [with-output-to-file i r is se] [with-output-to-port i] [write i r is se] [write-char i r is se] [call-with-input-file i r is se] [call-with-output-file i r is se] [hashtable-clear! i r ht] [hashtable-contains? i r ht] [hashtable-copy i r ht] [hashtable-delete! i r ht] [hashtable-entries i r ht] [hashtable-keys i r ht] [hashtable-mutable? i r ht] [hashtable-ref i r ht] [hashtable-set! i r ht] [hashtable-size i r ht] [hashtable-update! i r ht] [hashtable? i r ht] [make-eq-hashtable i r ht] [make-eqv-hashtable i r ht] [hashtable-hash-function i r ht] [make-hashtable i r ht] [hashtable-equivalence-function i r ht] [equal-hash i r ht] [string-hash i r ht] [string-ci-hash i r ht] [symbol-hash i r ht] [list-sort i r sr] [vector-sort i r sr] [vector-sort! i r sr] [file-exists? i r fi] [delete-file i r fi] [file-regular? i] [file-directory? i] [file-symbolic-link? i] [current-directory i] [directory-list i] [make-directory i] [delete-directory i] [change-mode i] [make-symbolic-link i] [file-ctime i] [define-record-type i r rs] [fields i r rs] [immutable i r rs] [mutable i r rs] [opaque i r rs] [parent i r rs] [parent-rtd i r rs] [protocol i r rs] [record-constructor-descriptor i r rs] [record-type-descriptor i r rs] [sealed i r rs] [nongenerative i r rs] [record-field-mutable? i r ri] [record-rtd i r ri] [record-type-field-names i r ri] [record-type-generative? i r ri] [record-type-name i r ri] [record-type-opaque? i r ri] [record-type-parent i r ri] [record-type-sealed? i r ri] [record-type-uid i r ri] [record? i r ri] [make-record-constructor-descriptor i r rp] [make-record-type-descriptor i r rp] [record-accessor i r rp] [record-constructor i r rp] [record-mutator i r rp] [record-predicate i r rp] [record-type-descriptor? i r rp] [bound-identifier=? i r sc] [datum->syntax i r sc] [syntax i r sc] [syntax->datum i r sc] [syntax-case i r sc] [unsyntax i r sc] [unsyntax-splicing i r sc] [quasisyntax i r sc] [with-syntax i r sc] [free-identifier=? i r sc] [generate-temporaries i r sc] [identifier? i r sc] [make-variable-transformer i r sc] [char-alphabetic? i r uc se] [char-ci<=? i r uc se] [char-ci=? i r uc se] [char-ci>? i r uc se] [char-downcase i r uc se] [char-foldcase i r uc] [char-titlecase i r uc] [char-upcase i r uc se] [char-general-category i r uc] [char-lower-case? i r uc se] [char-numeric? i r uc se] [char-title-case? i r uc] [char-upper-case? i r uc se] [char-whitespace? i r uc se] [string-ci<=? i r uc se] [string-ci=? i r uc se] [string-ci>? i r uc se] [string-downcase i r uc] [string-foldcase i r uc] [string-normalize-nfc i r uc] [string-normalize-nfd i r uc] [string-normalize-nfkc i r uc] [string-normalize-nfkd i r uc] [string-titlecase i r uc] [string-upcase i r uc] [getenv i] [nanosleep i] [char-ready? ] [load i] [void i $boot] [gensym i symbols $boot] [symbol-value i symbols $boot] [set-symbol-value! i symbols $boot] [eval-core $boot] [pretty-print i $boot] [pretty-format i] [pretty-width i] [module i cm] [library i] [syntax-dispatch ] [syntax-error i] [$transcoder->data $transc] [$data->transcoder $transc] [file-options-spec i] ;;; [port-id i] [read-annotated i] [read-script-annotated i] [annotation? i] [annotation-expression i] [annotation-source i] [annotation-stripped i] [port-closed? i] [$make-port $io] [$port-tag $io] [$port-id $io] [$port-cookie $io] [$port-transcoder $io] [$port-index $io] [$port-size $io] [$port-buffer $io] [$port-get-position $io] [$port-set-position! $io] [$port-close $io] [$port-read! $io] [$port-write! $io] [$set-port-index! $io] [$set-port-size! $io] [$port-attrs $io] [$set-port-attrs! $io] [$port-position $io] [$set-port-position! $io] [input-port-byte-position i] ;;; [&condition-rtd] [&condition-rcd] [&message-rtd] [&message-rcd] [&warning-rtd] [&warning-rcd] [&serious-rtd] [&serious-rcd] [&error-rtd] [&error-rcd] [&violation-rtd] [&violation-rcd] [&assertion-rtd] [&assertion-rcd] [&irritants-rtd] [&irritants-rcd] [&who-rtd] [&who-rcd] [&non-continuable-rtd] [&non-continuable-rcd] [&implementation-restriction-rtd] [&implementation-restriction-rcd] [&lexical-rtd] [&lexical-rcd] [&syntax-rtd] [&syntax-rcd] [&undefined-rtd] [&undefined-rcd] [&i/o-rtd] [&i/o-rcd] [&i/o-read-rtd] [&i/o-read-rcd] [&i/o-write-rtd] [&i/o-write-rcd] [&i/o-invalid-position-rtd] [&i/o-invalid-position-rcd] [&i/o-filename-rtd] [&i/o-filename-rcd] [&i/o-file-protection-rtd] [&i/o-file-protection-rcd] [&i/o-file-is-read-only-rtd] [&i/o-file-is-read-only-rcd] [&i/o-file-already-exists-rtd] [&i/o-file-already-exists-rcd] [&i/o-file-does-not-exist-rtd] [&i/o-file-does-not-exist-rcd] [&i/o-port-rtd] [&i/o-port-rcd] [&i/o-decoding-rtd] [&i/o-decoding-rcd] [&i/o-encoding-rtd] [&i/o-encoding-rcd] [&no-infinities-rtd] [&no-infinities-rcd] [&no-nans-rtd] [&no-nans-rcd] [&interrupted-rtd] [&interrupted-rcd] [&i/o-would-block-rtd] [&i/o-would-block-rcd] [tcp-connect i] [udp-connect i] [tcp-connect-nonblocking i] [udp-connect-nonblocking i] [tcp-server-socket i] [tcp-server-socket-nonblocking i] [accept-connection i] [accept-connection-nonblocking i] [close-tcp-server-socket i] [register-callback i] [input-socket-buffer-size i] [output-socket-buffer-size i] ;[&i/o-would-block i] ;[make-i/o-would-block-condition i] ;[i/o-would-block-condition? i] ;[i/o-would-block-port i] [ellipsis-map ] [scc-letrec i] [optimize-cp i] [optimize-level i] )) (define (macro-identifier? x) (and (assq x ikarus-system-macros) #t)) (define (procedure-identifier? x) (not (macro-identifier? x))) (define bootstrap-collection (let ([ls (let f ([ls library-legend]) (define required? cadddr) (define library-name cadr) (cond [(null? ls) '()] [(required? (car ls)) (cons (find-library-by-name (library-name (car ls))) (f (cdr ls)))] [else (f (cdr ls))]))]) (case-lambda [() ls] [(x) (unless (memq x ls) (set! ls (cons x ls)))]))) (define (verify-map) (define (f x) (for-each (lambda (x) (unless (assq x library-legend) (error 'verify "not in the libraries list" x))) (cdr x))) (for-each f identifier->library-map)) (library (ikarus makefile collections) (export make-collection) (import (rnrs)) (define (make-collection) (let ([set '()]) (case-lambda [() set] [(x) (set! set (cons x set))])))) (import (ikarus makefile collections)) (define (assq1 x ls) (let f ([x x] [ls ls] [p #f]) (cond [(null? ls) p] [(eq? x (caar ls)) (if p (if (pair? p) (if (eq? (cdr p) (cdar ls)) (f x (cdr ls) p) (f x (cdr ls) 2)) (f x (cdr ls) (+ p 1))) (f x (cdr ls) (car ls)))] [else (f x (cdr ls) p)]))) (define (make-system-data subst env) (define who 'make-system-data) (let ([export-subst (make-collection)] [export-env (make-collection)] [export-primlocs (make-collection)]) (for-each (lambda (x) (let ([name (car x)] [binding (cadr x)]) (let ([label (gensym)]) (export-subst (cons name label)) (export-env (cons label binding))))) ikarus-system-macros) (for-each (lambda (x) (when (procedure-identifier? x) (cond [(assq x (export-subst)) (error who "ambiguous export" x)] [(assq1 x subst) => ;;; primitive defined (exported) within the compiled libraries (lambda (p) (unless (pair? p) (error who "invalid exports" p x)) (let ([label (cdr p)]) (cond [(assq label env) => (lambda (p) (let ([binding (cdr p)]) (case (car binding) [(global) (export-subst (cons x label)) (export-env (cons label (cons 'core-prim x))) (export-primlocs (cons x (cdr binding)))] [else (error #f "invalid binding for identifier" p x)])))] [else (error #f "cannot find binding" x label)])))] [else ;;; core primitive with no backing definition, assumed to ;;; be defined in other strata of the system ;(printf "undefined primitive ~s\n" x) (let ([label (gensym)]) (export-subst (cons x label)) (export-env (cons label (cons 'core-prim x))))]))) (map car identifier->library-map)) (values (export-subst) (export-env) (export-primlocs)))) (define (get-export-subset key subst) (let f ([ls subst]) (cond [(null? ls) '()] [else (let ([x (car ls)]) (let ([name (car x)]) (cond [(assq name identifier->library-map) => (lambda (q) (cond [(memq key (cdr q)) (cons x (f (cdr ls)))] [else (f (cdr ls))]))] [else ;;; not going to any library? (f (cdr ls))])))]))) (define (build-system-library export-subst export-env primlocs) (define (build-library legend-entry) (let ([key (car legend-entry)] [name (cadr legend-entry)] [visible? (caddr legend-entry)]) (let ([id (gensym)] [name name] [version (if (eq? (car name) 'rnrs) '(6) '())] [import-libs '()] [visit-libs '()] [invoke-libs '()]) (let-values ([(subst env) (if (equal? name '(psyntax system $all)) (values export-subst export-env) (values (get-export-subset key export-subst) '()))]) `(install-library ',id ',name ',version ',import-libs ',visit-libs ',invoke-libs ',subst ',env void void '#f '#f ',visible? '#f))))) (let ([code `(library (ikarus primlocs) (export) ;;; must be empty (import (only (psyntax library-manager) install-library) (only (ikarus.compiler) current-primitive-locations) (ikarus)) (current-primitive-locations (lambda (x) (cond [(assq x ',primlocs) => cdr] [else #f]))) ,@(map build-library library-legend))]) (let-values ([(code empty-subst empty-env) (boot-library-expand code)]) code))) ;;; the first code to run on the system is one that initializes ;;; the value and proc fields of the location of $init-symbol-value! ;;; Otherwise, all subsequent inits to any global variable will ;;; segfault. (define (make-init-code) (define proc (gensym)) (define loc (gensym)) (define label (gensym)) (define sym (gensym)) (define val (gensym)) (define args (gensym)) (values (list `((case-lambda [(,proc) (,proc ',loc ,proc)]) (case-lambda [(,sym ,val) (begin ((primitive $set-symbol-value!) ,sym ,val) (if ((primitive procedure?) ,val) ((primitive $set-symbol-proc!) ,sym ,val) ((primitive $set-symbol-proc!) ,sym (case-lambda [,args ((primitive error) 'apply '"not a procedure" ((primitive $symbol-value) ,sym))]))))]))) `([$init-symbol-value! . ,label]) `([,label . (global . ,loc)]))) (define (expand-all files) ;;; remove all re-exported identifiers (those with labels in ;;; subst but not binding in env). (define (prune-subst subst env) (cond ((null? subst) '()) ((not (assq (cdar subst) env)) (prune-subst (cdr subst) env)) (else (cons (car subst) (prune-subst (cdr subst) env))))) (let-values (((code* subst env) (make-init-code))) (for-each (lambda (file) (printf "expanding ~s\n" file) (load file (lambda (x) (let-values ([(code export-subst export-env) (boot-library-expand x)]) (set! code* (cons code code*)) (set! subst (append export-subst subst)) (set! env (append export-env env)))))) files) (let-values ([(export-subst export-env export-locs) (make-system-data (prune-subst subst env) env)]) (let ([code (build-system-library export-subst export-env export-locs)]) (values (reverse (cons* (car code*) code (cdr code*))) export-locs))))) (verify-map) (time-it "the entire bootstrap process" (lambda () (let-values ([(core* locs) (time-it "macro expansion" (lambda () (parameterize ([current-library-collection bootstrap-collection]) (expand-all scheme-library-files))))]) (current-primitive-locations (lambda (x) (cond [(assq x locs) => cdr] [else (error 'bootstrap "no location for primitive" x)]))) (let ([p (open-file-output-port "ikarus.boot" (file-options no-fail))]) (time-it "code generation and serialization" (lambda () (for-each (lambda (x) (compile-core-expr-to-port x p)) core*))) (close-output-port p))))) (printf "Happy Happy Joy Joy\n") ;;; vim:syntax=scheme #!eof