API Documentation

Standard Libraries

This section of the Cyclone API is based on the R7RS Scheme Specification:

Library Name Description
Primitives This is not actually a library but rather a summary of all of the built-in functions (AKA primitives).
scheme base The R7RS base library. This is quite extensive and will be required by most programs.
scheme case-lambda Exports the case-lambda syntax.
scheme char Provides procedures for dealing with characters.
scheme complex Exports procedures for working with non-real numbers.
scheme cxr Exports twenty-four procedures which are the compositions of from three to four car and cdr operations.
scheme eval Exports procedures for evaluating Scheme data as programs.
scheme file Provides procedures for accessing files.
scheme inexact Procedures which are typically only useful with inexact values.
scheme lazy Procedures and syntax keywords for lazy evaluation.
scheme load Procedures for loading Scheme expressions from files.
scheme process-context Procedures for accessing with the program’s calling context.
scheme read Provides procedures for reading Scheme objects.
scheme repl Provides functions related to Read-Eval-Print-Loops.
scheme time Provides access to time-related values.
scheme write Provides procedures for writing Scheme objects.

SRFI Libraries

Cyclone supports the following Scheme Requests for Implementation (SRFI) libraries. Detailed information is available in the linked SRFI page as well as the provided Cyclone API.

Note that these libraries may be imported using either the SRFI number, such as (srfi 1), or a descriptive name: (scheme list). These descriptive names follow the recommendations from R7RS Large where available.

Library Name SRFI Number Description External Documentation
scheme list srfi 1 List library Link
cyclone and-let* srfi 2 AND-LET*: an AND with local bindings, a guarded LET* special form Link
N/A srfi 8 Binding to multiple values - Included as part of scheme base. Link
cyclone threads srfi 18 Multithreading support Link
cyclone random srfi 27 Sources of random bits Link
cyclone format srfi 28 Basic format strings Link
cyclone integer-bits srfi 60 Integers as bits Link
scheme hash-table srfi 69 Basic hash tables Link
cyclone socket srfi 106 Basic socket interface Link
scheme box srfi 111 Boxes Link
scheme set srfi 113 Sets and bags Link
scheme list-queue srfi 117 Mutable queues Link
scheme generator srfi 121 Generators Link
scheme comparator srfi 128 Comparators Link
scheme sort srfi 132 Sort libraries Link
scheme vector srfi 133 Vector library (R7RS-compatible) Link
cyclone fixnum srfi 143 Fixnums Link

Cyclone Libraries

These libraries are provided as Cyclone-specific extensions:

Library Name Description
cyclone concurrent A helper library for writing concurrent code.
cyclone foreign Provides a convenient interface for integrating with C code. It is recommended to use this library if possible rather than our lower-level FFI.
cyclone match A hygienic pattern matcher based on Alex Shinn’s portable match.scm.
cyclone test A unit testing framework ported from (chibi test).
scheme cyclone pretty-print A pretty printer.

Internal Compiler API

These libraries are used by the Cyclone compiler. Some of these are stable and unlikely to change, whereas others could change as the compiler evolves.

Library Name Description
scheme cyclone ast Abstract syntax tree types used during compilation.
scheme cyclone cgen C code generation
scheme cyclone common Mostly version numbers and header comments
scheme cyclone cps-optimizations Compiler optimizations, analysis, and related transformations
scheme cyclone libraries Compiler support for R7RS libraries
scheme cyclone primitives Compiler support for primitives
scheme cyclone transforms Various Scheme-to-Scheme transformations of the intermediate code
scheme cyclone util Utility functions used internally by the compiler


This documentation covers the C API provided by Cyclone Scheme. It is intended both to help understand how the Cyclone runtime works as well as to provide a useful reference manual when working with the Cyclone FFI.


This section is an alphabetic listing of all the functions, objects, and macros provided by the previous libraries.

%adb:make-fnc %adb:make-var

*Cyc-version-banner* * *af-inet* *af-inet6* *af-unspec* *ai-addrconfig* *ai-all* *ai-canonname* *ai-numerichost* *ai-v4mapped* *c-file-header-comment* *defined-macros* *do-code-gen* *ipproto-ip* *ipproto-tcp* *ipproto-udp* *msg-oob* *msg-peek* *msg-waitall* *primitives* *primitives* *primitives-num-args* *shut-rd* *shut-rdwr* *shut-wr* *sock-dgram* *sock-stream* *trace-level* *version* *version-banner* *version-name* *version-number*


->heap -


<=? <= <? <

=? =

>=? >= >? >

Cyc-er-compare? Cyc-er-rename Cyc-minor-gc

abs acos adb:clear! adbf:set-simple! adbf:set-unused-params! adbf:simple adb:function? adbf:unused-params adb:get adb:get-db adb:get/default adb:make-fnc adb:make-var adb:set! adb:variable? adbv:assigned-value adbv:const? adbv:const-value adbv:defined-by adbv:global? adbv:reassigned? adbv:ref-by adbv:set-assigned-value! adbv:set-const! adbv:set-const-value! adbv:set-defined-by! adbv:set-global! adbv:set-reassigned! adbv:set-ref-by! address-family address-info alist->bag alist-cons alist-copy alist-delete alist-delete! alist->hash-table alpha-convert analyze-cps analyze-mutable-variables and and-let* angle any any any-bits-set? app? app->args append append! append-map append-map! append-reverse append-reverse! app->fun apply arithmetic-shift ash asin assoc assq assq-remove-key assq-remove-keys assv ast:ast->pp-sexp ast:ast->sexp ast:lambda? ast:lambda-args ast:lambda-body ast:lambda-formals->list ast:lambda-formals-type ast:lambda-id ast:make-lambda ast:set-lambda-args! ast:set-lambda-body! ast:sexp->ast atan atom atom? azip

%adb:make-fnc %adb:make-var

*af-inet6* *af-inet* *af-unspec* *ai-addrconfig* *ai-all* *ai-canonname* *ai-numerichost* *ai-v4mapped*





< <=


> >=






bag-adjoin bag-adjoin! bag->alist bag-any? bag bag? bag=? bag<? bag>? bag<=? bag>=? bag-comparator bag-contains? bag-copy bag-count bag-decrement! bag-delete-all bag-delete-all! bag-delete bag-delete! bag-difference bag-difference! bag-disjoint? bag-element-comparator bag-element-count bag-empty? bag-every? bag-filter bag-filter! bag-find bag-fold bag-fold-unique bag-for-each bag-for-each-unique bag-increment! bag-intersection bag-intersection! bag->list bag-map bag-member bag-partition bag-partition! bag-product bag-product! bag-remove bag-remove! bag-replace bag-replace! bag-search! bag->set bag-size bag-sum bag-sum! bag-unfold bag-union bag-union! bag-unique-size bag-xor bag-xor! basename begin begin? begin->exps bit-count bit-field bit-set? bitwise-and bitwise-if bitwise-ior bitwise-merge bitwise-not bitwise-xor boolean? boolean=? boolean-hash booleans->integer box box? break break! built-in-syms bytevector bytevector? bytevector-append bytevector-copy bytevector-copy! bytevector->generator bytevector-length bytevector-u8-ref bytevector-u8-set!

caaaar caaadr caaar caadar caaddr caadr caar cadaar cadadr cadar caddar cadddr caddr cadr call/cc call-with-current-continuation call-with-input-file call-with-output-file call-with-port call-with-socket call-with-values car car+cdr case case-lambda c-code cdaaar cdaadr cdaar cdadar cdaddr cdadr cdar cddaar cddadr cddar cdddar cddddr cdddr cddr c-define c-define-type cdr ceiling cell? cell-get? cell-get->cell cell->value char-alphabetic? char? char<=? char<? char=? char>=? char>? char-ci<=? char-ci<? char-ci=? char-ci>=? char-ci>? char-ci-hash char-downcase char-foldcase char-hash char->integer char-lower-case? char-numeric? char-upcase char-upper-case? char-whitespace? circular-list? circular-list clear-mutables close-input-port close-output-port close-port closure? closure-convert closure->env closure->fv closure->lam command-line command-line-arguments comparator? comparator-check-type comparator-equality-predicate comparator-hashable? comparator-hash comparator-hash-function comparator-if<=> comparator-ordered? comparator-ordering-predicate comparator-register-default! comparator-test-type comparator-type-test-predicate compare-and-set! complex? concatenate concatenate! cond cond-expand condition-variable? condition-variable-broadcast! condition-variable-signal! condition-variable-wait! cons cons* const? copy-bit copy-bit-field cos count cps-convert create-environment current-error-port current-input-port current-jiffy current-output-port current-second current-test-applier current-test-comparator current-test-epsilon current-test-group current-test-group-reporter current-test-skipper current-test-verbosity current-thread current-thread-data c-value

Cyc-er-compare? Cyc-er-rename



*c-file-header-comment* *Cyc-version-banner*

default-hash default-random-source define? define-c? define->exp define->lambda define-lambda? define-record-type define->var delay delay-force delete delete delete! delete-duplicates delete-duplicates delete-duplicates! delete-file deliver denominator deref difference digit-value display do dotted-list? drop drop-right drop-right! drop-while dynamic-wind

*defined-macros* *do-code-gen*

eighth emergency-exit emit emit* emit-newline emits emits* env:add-binding-to-frame! env:all-values env:all-variables env:define-variable! env:enclosing-environment env:extend-environment env:first-frame env:frame-values env:frame-variables env-get? env-get->env env-get->field env-get->id env:lookup env:_lookup-variable-value env:lookup-variable-value env-make? env-make->fields env:make-frame env-make->id env-make->values env:set-variable-value! env:the-empty-environment eof-object? eof-object eq? equal? eqv? error error eval even? every every exact exact? exact-integer? exit expand exp expt

features fifth file-exists? filter filter filter! filter-map filter-unused-variables find find-tail finite? first first-set-bit fixnum? flatten floor floor/ floor-quotient floor-remainder floor-remainder flush-output-port fold foldl foldr fold-right force for-each formals->list fourth free-vars future? future future-call future-deref future-done? fxabs fxand fx=? fx- fx<? fx>? fx<=? fx>=? fx+ fx* fxarithmetic-shift fxarithmetic-shift-left fxarithmetic-shift-right fxbit-count fxbit-field fxbit-field-reverse fxbit-field-rotate fxbit-set? fxcopy-bit fxeven? fxfirst-set-bit fx-greatest fxif fxior fx-least fxlength fxmax fxmin fxneg fxnegative? fxnot fxodd? fxpositive? fxquotient fxremainder fxsqrt fxsquare fx-width fxxor fxzero?

gappend gcd gcombine gcons* gdelete gdelete-neighbor-dups gdrop gdrop-while generator-any generator generator-count generator-every generator-find generator-fold generator-for-each generator->list generator->reverse-list generator->string generator-unfold generator->vector generator->vector! gensym get-environment-variable get-environment-variables get-macros get-output-bytevector get-output-string gfilter gindex global-vars gremove gselect gtake gtake-while guard


has-global? hash hash-bound hash-by-identity hash-salt hash-table->alist hash-table? hash-table-copy hash-table-delete! hash-table-equivalence-function hash-table-exists? hash-table-fold hash-table-hash-function hash-table-keys hash-table-merge! hash-table-ref hash-table-ref/default hash-table-set! hash-table-size hash-table-update! hash-table-update!/default hash-table-values hash-table-walk

identifier=? identifier? identifier->symbol if? if->condition if->else if-else? if->then imag-part immutable? inexact inexact? infinite? input-port? input-port-open? insert integer? integer->char integer-length integer->list interaction-environment iota ip-protocol is-mutable? isolate-globals

*ipproto-ip* *ipproto-tcp* *ipproto-udp*


lambda? lambda->exp lambda->formals lambda-formals->list lambda-formals-type lambda-num-args lambda-varargs? lambda-varargs-var last last-pair lcm length length+ length/obj let let* let? let->args let->bindings let->bound-vars let->exp let=>lambda letrec letrec* letrec? letrec->args letrec->bindings letrec->bound-vars letrec->exp let*-values let-values lib:body lib:exports lib:get-all lib:get-all-import-deps lib:get-dep-list lib:idb:ids lib:import->export-list lib:import->filename lib:import->metalist lib:import->path lib:imports lib:imports->idb lib:include-c-headers lib:includes lib:list->import-set lib:name lib:name->string lib:name->symbol lib:name->unique-string library? library-exists? lib:read-imports lib:rename-exports lib:resolve-meta lib:result list list? list= list->bag list->bag! list-copy list-copy list-delete-neighbor-dups list-delete-neighbor-dups! list->generator list-index2 list-index list-index list-insert-at! list->integer list->lambda-formals list-merge list-merge! list->pair list-prefix? list-queue-add-back! list-queue-add-front! list-queue list-queue? list-queue-append list-queue-append! list-queue-back list-queue-concatenate list-queue-copy list-queue-empty? list-queue-first-last list-queue-for-each list-queue-front list-queue-list list-queue-map list-queue-map! list-queue-remove-all! list-queue-remove-back! list-queue-remove-front! list-queue-set-list! list-queue-unfold list-queue-unfold-right list-ref list-set! list->set list->set! list-sort list-sort! list-sorted? list-stable-sort list-stable-sort! list->string list-tabulate list-tail list->vector load log2-binary-factors logand log logbit? logcount logior lognot logtest logxor lset-adjoin lset<= lset= lset-difference lset-difference! lset-diff+intersection lset-diff+intersection! lset-intersection lset-intersection! lset-union lset-union! lset-xor lset-xor!

magnitude make-atom make-bytevector make-client-socket make-comparator make-condition-variable make-constructor make-coroutine-generator make-default-comparator make-eq-comparator make-equal-comparator make-eqv-comparator make-for-each-generator make-getter make-hash-table make-iota-generator make-list make-list make-list-comparator make-list-queue make-mutex make-pair-comparator make-parameter make-polar make-promise make-random-source make-range-generator make-rectangular make-server-socket make-setter make-shared-delay make-shared-promise make-shared-queue make-string make-thread make-thread-pool make-type-predicate make-unfold-generator make-vector make-vector-comparator mangle mangle-global map map! map-in-order mark-mutable match match-lambda match-lambda* match-let match-let* match-letrec max member memq memv message-type min modulo mta:code-gen mutex? mutex-lock! mutex-unlock!

*msg-oob* *msg-peek* *msg-waitall*

nan? negative? newline ninth not not-pair? null? null-list? number? number-hash number->string numerator

odd? one-instance-of-new-mutable-obj? open-input-bytevector open-input-file open-input-string open-output-bytevector open-output-file open-output-string opt:contract optimize-cps opt:inline-prims or output-port? output-port-open?

pack-lambda-arguments pair? pair-fold pair-fold-right pair-for-each pair->list parameterize partition partition! peek-char port? pos-in-list positive? precompute-prim-app? pretty-print prim:allocates-object?) prim? prim:arg-count? prim-call? prim->c-func prim:check-arg-count prim:cont? prim:cont/no-args? prim/cvar? prim/c-var-assign prim/data-arg? prim:mutates? procedure? promise? proper-list?


quasiquote quote? quotient

raise raise-continuable random-integer random-real random-source? random-source-make-integers random-source-make-reals random-source-pseudo-randomize! random-source-randomize! random-source-state-ref random-source-state-set! rational? read-all read read-char read-line read-string real? realized? real-part receive record? reduce reduce reduce-right ref? remainder remove remove remove! repl reverse reverse! reverse-list->vector reverse-vector->generator reverse-vector->list rotate-bit-field round

*shut-rd* *shut-rdwr* *shut-wr* *sock-dgram* *sock-stream*

second set-adjoin set-adjoin! set-any? set!? set set? set=? set<? set>? set<=? set>=? set->bag set->bag! set-box! set-car! set-cdr! set-cell!? set-cell!->cell set-cell!->value set-comparator set-contains? set-copy set-count set-delete-all set-delete-all! set-delete set-delete! set-difference set-difference! set-disjoint? set-element-comparator set-empty? set-every? set!->exp set-filter set-filter! set-find set-fold set-for-each set-intersection set-intersection! set->list set-map set-member set-partition set-partition! set-remove set-remove! set-replace set-replace! set-search! set-size set-unfold set-union set-union! setup-environment set!->var set-xor set-xor! seventh shared-delay? shared-delay shared-promise? shared-queue-add! shared-queue shared-queue? shared-queue-capacity shared-queue-clear! shared-queue-empty? shared-queue-remove! shared-queue-size shared-queue-wait-count shutdown-method simple-lambda? sin sixth slot-set! socket-accept socket? socket-close socket-domain socket-input-port socket-merge-flags socket-output-port socket-purge-flags socket-recv socket-send socket-shutdown span span! split-at split-at! sqrt square string? string string<=? string<? string=? string>=? string>? string-append string-ci<=? string-ci<? string-ci=? string-ci>=? string-ci>? string-ci-hash string-ci-hash string-cmp string-copy string-copy! string-downcase string-fill! string-foldcase string-for-each string->generator string-hash string-hash string-join string-length string->list string-map string->number string-ref string-replace-all string-set! string-split string->symbol string-upcase string->utf8 string->vector substring swap! symbol? symbol=? symbol<? symbol-hash symbol->string syntax-error system


tagged-list? take take take! take-right take-while take-while! tan tenth test test-assert test-begin test-end test-equal test-error test-exit test-failure-count test-group test-not test-propagate-info test-run test-values third thread? thread-join! thread-name thread-pool? thread-pool-idling? thread-pool-idling-count thread-pool-push-task! thread-pool-release! thread-pool-size thread-sleep! thread-specific thread-specific-set! thread-start! thread-terminate! thread-yield! trace trace:debug trace:error trace:info trace:warn truncate truncate/ truncate-quotient truncate-remainder type-slot-offset

unbox unfold unfold-right union unless unzip1 unzip2 unzip3 unzip4 unzip5 utf8->string

*version* *version-banner* *version-name* *version-number*

values vector-any vector? vector vector= vector-append vector-append-subvectors vector-binary-search vector-concatenate vector-copy vector-copy! vector-count vector-cumulate vector-delete-neighbor-dups vector-delete-neighbor-dups! vector-empty? vector-every vector-fill! vector-find-median vector-find-median! vector-fold vector-fold-right vector-for-each vector->generator vector-index vector-index-right vector-length vector->list vector-map vector-map! vector-merge vector-merge! vector-partition vector-ref vector-reverse! vector-reverse-copy vector-reverse-copy! vector-select! vector-separate! vector-set! vector-skip vector-skip-right vector-sort vector-sort! vector-sorted? vector-stable-sort vector-stable-sort! vector->string vector-swap! vector-unfold vector-unfold! vector-unfold-right vector-unfold-right!

when with-exception-handler with-handler with-input-from-file with-output-to-file wrap-mutables write write-char write-shared write-simple write-string


zero? zip