rackety inside doc

This commit is contained in:
Matthew Flatt 2010-04-30 21:58:08 -06:00
parent 81ba669237
commit 77a99f6aa0
16 changed files with 321 additions and 305 deletions

View File

@ -4,7 +4,7 @@
@title{Custodians} @title{Custodians}
When an extension allocates resources that must be explicitly freed When an extension allocates resources that must be explicitly freed
(in the same way that a port must be explicitly closed), a Scheme (in the same way that a port must be explicitly closed), a Racket
object associated with the resource should be placed into the object associated with the resource should be placed into the
management of the current custodian with @cppi{scheme_add_managed}. management of the current custodian with @cppi{scheme_add_managed}.
@ -93,7 +93,7 @@ Instructs the custodian @var{m} to shutdown all of its managed values.}
[Scheme_Exit_Closer_Func f])]{ [Scheme_Exit_Closer_Func f])]{
Installs a function to be called on each custodian-registered item and Installs a function to be called on each custodian-registered item and
its closer when MzScheme is about to exit. The registered function its closer when Racket is about to exit. The registered function
has the type has the type
@verbatim[#:indent 2]{ @verbatim[#:indent 2]{

View File

@ -3,7 +3,7 @@
@title{Evaluation} @title{Evaluation}
A Scheme S-expression is evaluated by calling @cppi{scheme_eval}. A Racket S-expression is evaluated by calling @cppi{scheme_eval}.
This function takes an S-expression (as a @cpp{Scheme_Object*}) and a This function takes an S-expression (as a @cpp{Scheme_Object*}) and a
namespace and returns the value of the expression in that namespace. namespace and returns the value of the expression in that namespace.
@ -12,7 +12,7 @@ a procedure, the number of arguments to pass to the procedure, and an
array of @cpp{Scheme_Object *} arguments. The return value is the array of @cpp{Scheme_Object *} arguments. The return value is the
result of the application. There is also a function result of the application. There is also a function
@cppi{scheme_apply_to_list}, which takes a procedure and a list @cppi{scheme_apply_to_list}, which takes a procedure and a list
(constructed with @cppi{scheme_make_pair}) and performs the Scheme (constructed with @cppi{scheme_make_pair}) and performs the Racket
@scheme[apply] operation. @scheme[apply] operation.
The @cppi{scheme_eval} function actually calls @cppi{scheme_compile} The @cppi{scheme_eval} function actually calls @cppi{scheme_compile}
@ -43,15 +43,15 @@ see @secref["exceptions"].
@section-index{tail recursion} @section-index{tail recursion}
All of Scheme's built-in functions and syntax support proper All of Racket's built-in functions and syntax support proper
tail-recursion. When a new primitive procedure or syntax is added to tail-recursion. When a new primitive procedure or syntax is added to
Scheme, special care must be taken to ensure that tail recursion is Racket, special care must be taken to ensure that tail recursion is
handled properly. Specifically, when the final return value of a handled properly. Specifically, when the final return value of a
function is the result of an application, then function is the result of an application, then
@cppi{scheme_tail_apply} should be used instead of @cppi{scheme_tail_apply} should be used instead of
@cppi{scheme_apply}. When @cppi{scheme_tail_apply} is called, it @cppi{scheme_apply}. When @cppi{scheme_tail_apply} is called, it
postpones the procedure application until control returns to the postpones the procedure application until control returns to the
Scheme evaluation loop. Racket evaluation loop.
For example, consider the following implementation of a For example, consider the following implementation of a
@scheme[thunk-or] primitive, which takes any number of thunks and @scheme[thunk-or] primitive, which takes any number of thunks and
@ -158,9 +158,9 @@ Non-top-level version of @cpp{scheme_eval_compiled_multi}. (See @secref["topleve
@function[(Scheme_Env* scheme_basic_env)]{ @function[(Scheme_Env* scheme_basic_env)]{
Creates the main namespace for an embedded PLT Scheme. This procedure Creates the main namespace for an embedded Racket. This procedure
must be called before other Scheme library function (except must be called before other Racket library function (except
@cpp{scheme_make_param}). Extensions to Scheme cannot call this @cpp{scheme_make_param}). Extensions to Racket cannot call this
function. function.
If it is called more than once, this function resets all threads If it is called more than once, this function resets all threads
@ -176,7 +176,7 @@ Creates and returns a new namespace. This values can be cast to
a parameterization using @cppi{scheme_set_param} with a parameterization using @cppi{scheme_set_param} with
@cppi{MZCONFIG_ENV}. @cppi{MZCONFIG_ENV}.
When PLT Scheme is embedded in an application, create the initial When Racket is embedded in an application, create the initial
namespace with @cppi{scheme_basic_env} before calling this procedure namespace with @cppi{scheme_basic_env} before calling this procedure
to create new namespaces.} to create new namespaces.}

View File

@ -3,7 +3,7 @@
@title[#:tag "exceptions"]{Exceptions and Escape Continuations} @title[#:tag "exceptions"]{Exceptions and Escape Continuations}
When Scheme encounters an error, it raises an exception. The default When Racket encounters an error, it raises an exception. The default
exception handler invokes the error display handler and then the error exception handler invokes the error display handler and then the error
escape handler. The default error escape handler escapes via a escape handler. The default error escape handler escapes via a
@defterm{primitive error escape}, which is implemented by calling @defterm{primitive error escape}, which is implemented by calling
@ -12,7 +12,7 @@ escape handler. The default error escape handler escapes via a
An embedding program should install a fresh buffer into An embedding program should install a fresh buffer into
@cpp{scheme_current_thread->error_buf} and call @cpp{scheme_current_thread->error_buf} and call
@cpp{scheme_setjmp(*scheme_current_thread->error_buf)} before any @cpp{scheme_setjmp(*scheme_current_thread->error_buf)} before any
top-level entry into Scheme evaluation to catch primitive error top-level entry into Racket evaluation to catch primitive error
escapes. When the new buffer goes out of scope, restore the original escapes. When the new buffer goes out of scope, restore the original
in @cpp{scheme_current_thread->error_buf}. The macro in @cpp{scheme_current_thread->error_buf}. The macro
@cppi{scheme_error_buf} is a shorthand for @cppi{scheme_error_buf} is a shorthand for
@ -47,12 +47,12 @@ New primitive procedures can raise a generic exception by calling
function @cpp{printf}. A specific primitive exception can be raised by function @cpp{printf}. A specific primitive exception can be raised by
calling @cppi{scheme_raise_exn}. calling @cppi{scheme_raise_exn}.
Full @as-index{continuations} are implemented in Scheme by copying Full @as-index{continuations} are implemented in Racket by copying
the C stack and using @cppi{scheme_setjmp} and @cppi{scheme_longjmp}. the C stack and using @cppi{scheme_setjmp} and @cppi{scheme_longjmp}.
As long a C/C++ application invokes Scheme evaluation through the As long a C/C++ application invokes Racket evaluation through the
top-level evaluation functions (@cpp{scheme_eval}, @cpp{scheme_apply}, top-level evaluation functions (@cpp{scheme_eval}, @cpp{scheme_apply},
etc., as opposed to @cpp{_scheme_apply}, @cpp{_scheme_eval_compiled}, etc., as opposed to @cpp{_scheme_apply}, @cpp{_scheme_eval_compiled},
etc.), the code is protected against any unusual behavior from Scheme etc.), the code is protected against any unusual behavior from Racket
evaluations (such as returning twice from a function) because evaluations (such as returning twice from a function) because
continuation invocations are confined to jumps within a single continuation invocations are confined to jumps within a single
top-level evaluation. However, escape continuation jumps are still top-level evaluation. However, escape continuation jumps are still
@ -109,11 +109,11 @@ calls top-level evaluation functions (@cpp{scheme_eval},
@cpp{_scheme_eval_compiled}, etc.). Otherwise, use @cpp{_scheme_eval_compiled}, etc.). Otherwise, use
@cppi{scheme_dynamic_wind} to protect your code against full @cppi{scheme_dynamic_wind} to protect your code against full
continuation jumps in the same way that @scheme[dynamic-wind] is used continuation jumps in the same way that @scheme[dynamic-wind] is used
in Scheme. in Racket.
The above solution simply traps the escape; it doesn't report the The above solution simply traps the escape; it doesn't report the
reason that the escape occurred. To catch exceptions and obtain reason that the escape occurred. To catch exceptions and obtain
information about the exception, the simplest route is to mix Scheme information about the exception, the simplest route is to mix Racket
code with C-implemented thunks. The code below can be used to catch code with C-implemented thunks. The code below can be used to catch
exceptions in a variety of situations. It implements the function exceptions in a variety of situations. It implements the function
@cpp{_apply_catch_exceptions}, which catches exceptions during the @cpp{_apply_catch_exceptions}, which catches exceptions during the
@ -148,7 +148,7 @@ application of a thunk. (This code is in
} }
} }
/* This function applies a thunk, returning the Scheme value if /* This function applies a thunk, returning the Racket value if
there's no exception, otherwise returning NULL and setting *exn there's no exception, otherwise returning NULL and setting *exn
to the raised value (usually an exn structure). */ to the raised value (usually an exn structure). */
Scheme_Object *_apply_thunk_catch_exceptions(Scheme_Object *f, Scheme_Object *_apply_thunk_catch_exceptions(Scheme_Object *f,
@ -184,9 +184,11 @@ In the following example, the above code is used to catch exceptions
that occur during while evaluating source code from a string. that occur during while evaluating source code from a string.
@verbatim[#:indent 2]{ @verbatim[#:indent 2]{
static Scheme_Object *do_eval(void *s, int noargc, Scheme_Object **noargv) static Scheme_Object *do_eval(void *s, int noargc,
Scheme_Object **noargv)
{ {
return scheme_eval_string((char *)s, scheme_get_env(scheme_config)); return scheme_eval_string((char *)s,
scheme_get_env(scheme_config));
} }
static Scheme_Object *eval_string_or_get_exn_message(char *s) static Scheme_Object *eval_string_or_get_exn_message(char *s)
@ -213,12 +215,12 @@ that occur during while evaluating source code from a string.
@section{Enabling and Disabling Breaks} @section{Enabling and Disabling Breaks}
When embedding PLT Scheme, asynchronous break exceptions are disabled by When embedding Racket, asynchronous break exceptions are disabled by
default. Call @cpp{scheme_set_can_break} (which is the same as calling default. Call @cpp{scheme_set_can_break} (which is the same as calling
the Scheme funciton @scheme[break-enabled]) to enable or disable the Racket funciton @scheme[break-enabled]) to enable or disable
breaks. To enable or disable breaks during the dynamic extent of breaks. To enable or disable breaks during the dynamic extent of
another evaluation (where you would use another evaluation (where you would use
@scheme[with-break-parameterization] in Scheme), use @scheme[with-break-parameterization] in Racket), use
@cppi{scheme_push_break_enable} before and @cppi{scheme_push_break_enable} before and
@cppi{scheme_pop_break_enable} after, instead. @cppi{scheme_pop_break_enable} after, instead.
@ -245,7 +247,7 @@ for @cpp{printf}, but with the following format directives:
@item{@FormatD{5} : a nul-terminated @cpp{mzchar} string} @item{@FormatD{5} : a nul-terminated @cpp{mzchar} string}
@item{@FormatD{S} : a Scheme symbol (a @cpp{Scheme_Object*})} @item{@FormatD{S} : a Racket symbol (a @cpp{Scheme_Object*})}
@item{@FormatD{t} : a @cpp{char} string with a @cpp{long} size (two @item{@FormatD{t} : a @cpp{char} string with a @cpp{long} size (two
arguments), possibly containing a non-terminating nul byte, and arguments), possibly containing a non-terminating nul byte, and
@ -255,16 +257,16 @@ for @cpp{printf}, but with the following format directives:
arguments), possibly containing a non-terminating nul character, and arguments), possibly containing a non-terminating nul character, and
possibly without a nul-terminator} possibly without a nul-terminator}
@item{@FormatD{T} : a Scheme string (a @cpp{Scheme_Object*})} @item{@FormatD{T} : a Racket string (a @cpp{Scheme_Object*})}
@item{@FormatD{q} : a string, truncated to 253 characters, with ellipses @item{@FormatD{q} : a string, truncated to 253 characters, with ellipses
printed if the string is truncated} printed if the string is truncated}
@item{@FormatD{Q} : a Scheme string (a @cpp{Scheme_Object*}), @item{@FormatD{Q} : a Racket string (a @cpp{Scheme_Object*}),
truncated to 253 characters, with ellipses printed if the string is truncated to 253 characters, with ellipses printed if the string is
truncated} truncated}
@item{@FormatD{V} : a Scheme value (a @cpp{Scheme_Object*}), @item{@FormatD{V} : a Racket value (a @cpp{Scheme_Object*}),
truncated according to the current error print width.} truncated according to the current error print width.}
@item{@FormatD{e} : an @cpp{errno} value, to be printed as a text @item{@FormatD{e} : an @cpp{errno} value, to be printed as a text
@ -282,7 +284,7 @@ for @cpp{printf}, but with the following format directives:
] ]
The arguments following the format string must include no more than 25 The arguments following the format string must include no more than 25
strings and Scheme values, 25 integers, and 25 floating-point strings and Racket values, 25 integers, and 25 floating-point
numbers. (This restriction simplifies the implementation with precise numbers. (This restriction simplifies the implementation with precise
garbage collection.)} garbage collection.)}
@ -298,7 +300,7 @@ fields). The remaining arguments start with an error string and
proceed roughly as for @cpp{printf}; see @cpp{scheme_signal_error} proceed roughly as for @cpp{printf}; see @cpp{scheme_signal_error}
above for more details. above for more details.
Exception ids are @cpp{#define}d using the same names as in Scheme, Exception ids are @cpp{#define}d using the same names as in Racket,
but prefixed with ``MZ'', all letters are capitalized, and all ``:'s', but prefixed with ``MZ'', all letters are capitalized, and all ``:'s',
``-''s, and ``/''s are replaced with underscores. For example, ``-''s, and ``/''s are replaced with underscores. For example,
@cpp{MZEXN_FAIL_FILESYSTEM} is the exception id for a filesystem @cpp{MZEXN_FAIL_FILESYSTEM} is the exception id for a filesystem
@ -370,8 +372,8 @@ variable.}
[int count] [int count]
[int* len])]{ [int* len])]{
Converts a Scheme value into a string for the purposes of reporting an Converts a Racket value into a string for the purposes of reporting an
error message. The @var{count} argument specifies how many Scheme error message. The @var{count} argument specifies how many Racket
values total will appear in the error message (so the string for this values total will appear in the error message (so the string for this
value can be scaled appropriately). If @var{len} is not @cpp{NULL}, it value can be scaled appropriately). If @var{len} is not @cpp{NULL}, it
is filled with the length of the returned string.} is filled with the length of the returned string.}
@ -384,7 +386,7 @@ is filled with the length of the returned string.}
[Scheme_Object** argv] [Scheme_Object** argv]
[long* len])]{ [long* len])]{
Converts an array of Scheme values into a byte string, skipping the Converts an array of Racket values into a byte string, skipping the
array element indicated by @var{which}. This function is used to array element indicated by @var{which}. This function is used to
specify the ``other'' arguments to a function when one argument is bad specify the ``other'' arguments to a function when one argument is bad
(thus giving the user more information about the state of the program (thus giving the user more information about the state of the program

View File

@ -3,7 +3,7 @@
@title{Flags and Hooks} @title{Flags and Hooks}
The following flags and hooks are available when PLT Scheme is The following flags and hooks are available when Racket is
embedded: embedded:
@itemize[ @itemize[
@ -14,7 +14,7 @@ embedded:
@item{@cppdef{scheme_make_stdin}, @cppdef{scheme_make_stdout}, @item{@cppdef{scheme_make_stdin}, @cppdef{scheme_make_stdout},
@cppdef{scheme_make_stderr}, --- These pointers can be set to a @cppdef{scheme_make_stderr}, --- These pointers can be set to a
function that takes no arguments and returns a Scheme port function that takes no arguments and returns a Racket port
@cpp{Scheme_Object *} to be used as the starting standard input, @cpp{Scheme_Object *} to be used as the starting standard input,
output, and/or error port. The defaults are @cpp{NULL}. Setting the output, and/or error port. The defaults are @cpp{NULL}. Setting the
initial error port is particularly important for seeing unexpected initial error port is particularly important for seeing unexpected
@ -22,7 +22,7 @@ embedded:
@item{@cppdef{scheme_console_output} --- This pointer can be set to a @item{@cppdef{scheme_console_output} --- This pointer can be set to a
function that takes a string and a @cpp{long} string length; the function that takes a string and a @cpp{long} string length; the
function will be called to display internal MzScheme warnings and function will be called to display internal Racket warnings and
messages that possibly contain non-terminating nuls. The default is messages that possibly contain non-terminating nuls. The default is
@var{NULL}.} @var{NULL}.}
@ -36,7 +36,7 @@ embedded:
@item{@cppdef{scheme_case_sensitive} --- If this flag is set to a @item{@cppdef{scheme_case_sensitive} --- If this flag is set to a
non-zero value before @cppi{scheme_basic_env} is called, then non-zero value before @cppi{scheme_basic_env} is called, then
MzScheme will not ignore capitalization for symbols and global Racket will not ignore capitalization for symbols and global
variable names. The value of this flag should not change once it is variable names. The value of this flag should not change once it is
set. The default is zero.} set. The default is zero.}

View File

@ -2,19 +2,19 @@
@(require "utils.ss") @(require "utils.ss")
@title[#:tag-prefix '(lib "scribblings/inside/inside.scrbl") @title[#:tag-prefix '(lib "scribblings/inside/inside.scrbl")
#:tag "top"]{@bold{Inside}: PLT Scheme C API} #:tag "top"]{@bold{Inside}: Racket C API}
@author["Matthew Flatt"] @author["Matthew Flatt"]
This manual describes PLT Scheme's C interface, which allows the This manual describes Racket's C interface, which allows the
interpreter to be extended by a dynamically-loaded library, or interpreter to be extended by a dynamically-loaded library, or
embedded within an arbitrary C/C++ program. The manual assumes embedded within an arbitrary C/C++ program. The manual assumes
familiarity with PLT Scheme as described in @|MzScheme|. familiarity with Racket as described in @|MzScheme|.
For an alternative way of dealing with foreign code, see For an alternative way of dealing with foreign code, see
@other-manual['(lib "scribblings/foreign/foreign.scrbl")], which @other-manual['(lib "scribblings/foreign/foreign.scrbl")], which
describes the @schememodname[scheme/foreign] module for manipulating describes the @racketmodname[ffi/unsafe] module for manipulating
low-level libraries and structures purely through Scheme code. low-level libraries and structures purely through Racket code.
@table-of-contents[] @table-of-contents[]

View File

@ -6,14 +6,14 @@
@section-index{memory} @section-index{memory}
@section-index{garbage collection} @section-index{garbage collection}
PLT Scheme uses both @cppi{malloc} and allocation functions provided Racket uses both @cppi{malloc} and allocation functions provided
by a garbage collector. Embedding/extension C/C++ code may use either by a garbage collector. Embedding/extension C/C++ code may use either
allocation method, keeping in mind that pointers to allocation method, keeping in mind that pointers to
garbage-collectable blocks in @cpp{malloc}ed memory are invisible garbage-collectable blocks in @cpp{malloc}ed memory are invisible
(i.e., such pointers will not prevent the block from being (i.e., such pointers will not prevent the block from being
garbage-collected). garbage-collected).
PLT Scheme CGC uses a conservative garbage collector. This garbage Racket CGC uses a conservative garbage collector. This garbage
collector normally only recognizes pointers to the beginning of collector normally only recognizes pointers to the beginning of
allocated objects. Thus, a pointer into the middle of a GC-allocated allocated objects. Thus, a pointer into the middle of a GC-allocated
string will normally not keep the string from being collected. The string will normally not keep the string from being collected. The
@ -22,7 +22,7 @@ registers may point to the middle of a collectable object. Thus, it
is safe to loop over an array by incrementing a local pointer is safe to loop over an array by incrementing a local pointer
variable. variable.
PLT Scheme 3m uses a precise garbage collector that moves objects Racket 3m uses a precise garbage collector that moves objects
during collection, in which case the C code must be instrumented to during collection, in which case the C code must be instrumented to
expose local pointer bindings to the collector, and to provide tracing expose local pointer bindings to the collector, and to provide tracing
procedures for (tagged) records containing pointers. This procedures for (tagged) records containing pointers. This
@ -74,8 +74,8 @@ The basic collector allocation functions are:
] ]
@index['("globals" "in extension code")]{If} a PLT Scheme extension @index['("globals" "in extension code")]{If} a Racket extension
stores Scheme pointers in a global or static variable, then that stores Racket pointers in a global or static variable, then that
variable must be registered with variable must be registered with
@cppi{scheme_register_extension_global}; this makes the pointer @cppi{scheme_register_extension_global}; this makes the pointer
visible to the garbage collector. Registered variables need not visible to the garbage collector. Registered variables need not
@ -98,8 +98,8 @@ Collectable memory can be temporarily locked from collection by using
the reference-counting function @cppi{scheme_dont_gc_ptr}. Under 3m, the reference-counting function @cppi{scheme_dont_gc_ptr}. Under 3m,
such locking does not prevent the object from being moved. such locking does not prevent the object from being moved.
Garbage collection can occur during any call into Scheme or its Garbage collection can occur during any call into Racket or its
allocator, on anytime that Scheme has control, except during functions allocator, on anytime that Racket has control, except during functions
that are documented otherwise. The predicate and accessor macros that are documented otherwise. The predicate and accessor macros
listed in @secref["im:stdtypes"] never trigger a collection. listed in @secref["im:stdtypes"] never trigger a collection.
@ -115,7 +115,7 @@ content of a word registered as a pointer must contain either
into an object allocated by @cpp{scheme_malloc_allow_interior}, a into an object allocated by @cpp{scheme_malloc_allow_interior}, a
pointer to an object currently allocated by another memory manager pointer to an object currently allocated by another memory manager
(and therefore not into a block that is currently managed by the (and therefore not into a block that is currently managed by the
collector), or a pointer to an odd-numbered address (e.g., a Scheme collector), or a pointer to an odd-numbered address (e.g., a Racket
fixnum). fixnum).
Pointers are registered in three different ways: Pointers are registered in three different ways:
@ -158,7 +158,7 @@ retaining such a pointer can lead to a crash.
As explained in @secref["im:values+types"], the @cpp{scheme_make_type} As explained in @secref["im:values+types"], the @cpp{scheme_make_type}
function can be used to obtain a new tag for a new type of object. function can be used to obtain a new tag for a new type of object.
These new types are in relatively short supply for 3m; the maximum tag These new types are in relatively short supply for 3m; the maximum tag
is 255, and Scheme itself uses nearly 200. is 255, and Racket itself uses nearly 200.
After allocating a new tag in 3m (and before creating instances of the After allocating a new tag in 3m (and before creating instances of the
tag), a @defterm{size procedure}, a @defterm{mark procedure}, and a tag), a @defterm{size procedure}, a @defterm{mark procedure}, and a
@ -434,7 +434,7 @@ is not defined, so the macros can be placed into code to be compiled
for both conservative and precise collection. for both conservative and precise collection.
The @cpp{MZ_GC_REG} and @cpp{MZ_GC_UNREG} macros must never be The @cpp{MZ_GC_REG} and @cpp{MZ_GC_UNREG} macros must never be
used in an OS thread other than Scheme's thread. used in an OS thread other than Racket's thread.
@; - - - - - - - - - - - - - - - - - - - - - - - - @; - - - - - - - - - - - - - - - - - - - - - - - -
@ -700,7 +700,7 @@ Frees memory allocated with @cpp{scheme_malloc_code}.}
[void* ptr] [void* ptr]
[long size])]{ [long size])]{
Registers an extension's global variable that can contain Scheme Registers an extension's global variable that can contain Racket
pointers. The address of the global is given in @var{ptr}, and its pointers. The address of the global is given in @var{ptr}, and its
size in bytes in @var{size}.In addition to global variables, this size in bytes in @var{size}.In addition to global variables, this
function can be used to register any permanent memory that the function can be used to register any permanent memory that the
@ -788,7 +788,7 @@ in the stack than @cpp{dummy}. To avoid these problems, use
Like @cpp{scheme_set_stack_base}, except for the extra Like @cpp{scheme_set_stack_base}, except for the extra
@var{stack_end} argument. If @var{stack_end} is non-@cpp{NULL}, then @var{stack_end} argument. If @var{stack_end} is non-@cpp{NULL}, then
it corresponds to a point of C-stack growth after which Scheme it corresponds to a point of C-stack growth after which Racket
should attempt to handle stack overflow. The @var{stack_end} argument should attempt to handle stack overflow. The @var{stack_end} argument
should not correspond to the actual stack end, since detecting stack should not correspond to the actual stack end, since detecting stack
overflow may take a few frames, and since handling stack overflow overflow may take a few frames, and since handling stack overflow
@ -895,9 +895,9 @@ To remove an added finalizer, use @cpp{scheme_subtract_finalizer}.}
Installs a ``will''-like finalizer, similar to @scheme[will-register]. Installs a ``will''-like finalizer, similar to @scheme[will-register].
Scheme finalizers are called one at a time, requiring the collector Scheme finalizers are called one at a time, requiring the collector
to prove that a value has become inaccessible again before calling to prove that a value has become inaccessible again before calling
the next Scheme finalizer. Finalizers registered with the next Racket finalizer. Finalizers registered with
@cpp{scheme_register_finalizer} or @cpp{scheme_add_finalizer} are @cpp{scheme_register_finalizer} or @cpp{scheme_add_finalizer} are
not called until all Scheme finalizers have been exhausted. not called until all Racket finalizers have been exhausted.
See @cpp{scheme_register_finalizer}, above, for information about See @cpp{scheme_register_finalizer}, above, for information about
the arguments. the arguments.

View File

@ -4,7 +4,7 @@
@title{Miscellaneous Utilities} @title{Miscellaneous Utilities}
The @cppi{MZSCHEME_VERSION} preprocessor macro is defined as a string The @cppi{MZSCHEME_VERSION} preprocessor macro is defined as a string
describing the version of Scheme. The @cppi{MZSCHEME_VERSION_MAJOR} describing the version of Racket. The @cppi{MZSCHEME_VERSION_MAJOR}
and @cppi{MZSCHEME_VERSION_MINOR} macros are defined as the major and and @cppi{MZSCHEME_VERSION_MINOR} macros are defined as the major and
minor version numbers, respectively. minor version numbers, respectively.
@ -35,7 +35,7 @@ Like @cpp{scheme_equal}, but accepts an extra value for cycle
tracking. This procedure is meant to be called by a procedure tracking. This procedure is meant to be called by a procedure
installed with @cpp{scheme_set_type_equality}.} installed with @cpp{scheme_set_type_equality}.}
Returns 1 if the Scheme values are @scheme[equal?].} Returns 1 if the Racket values are @scheme[equal?].}
@function[(long scheme_equal_hash_key @function[(long scheme_equal_hash_key
[Scheme_Object* obj])]{ [Scheme_Object* obj])]{
@ -150,13 +150,13 @@ The same as @scheme[namespace-require].}
@function[(Scheme_Object* scheme_load @function[(Scheme_Object* scheme_load
[char* file])]{ [char* file])]{
Loads the specified Scheme file, returning the value of the last Loads the specified Racket file, returning the value of the last
expression loaded, or @cpp{NULL} if the load fails.} expression loaded, or @cpp{NULL} if the load fails.}
@function[(Scheme_Object* scheme_load_extension @function[(Scheme_Object* scheme_load_extension
[char* filename])]{ [char* filename])]{
Loads the specified Scheme extension file, returning the value provided Loads the specified Racket extension file, returning the value provided
by the extension's initialization function.} by the extension's initialization function.}
@function[(Scheme_Hash_Table* scheme_make_hash_table @function[(Scheme_Hash_Table* scheme_make_hash_table
@ -170,7 +170,7 @@ table hashes on a key's pointer address, while
@cpp{SCHEME_hash_string} uses a key as a @cpp{char*} and hashes on the @cpp{SCHEME_hash_string} uses a key as a @cpp{char*} and hashes on the
null-terminated string content. Since a hash table created with null-terminated string content. Since a hash table created with
@cpp{SCHEME_hash_string} (instead of @cpp{SCHEME_hash_ptr}) does not @cpp{SCHEME_hash_string} (instead of @cpp{SCHEME_hash_ptr}) does not
use a key as a Scheme value, it cannot be used from Scheme code. use a key as a Racket value, it cannot be used from Racket code.
Although the hash table interface uses the type @cpp{Scheme_Object*} Although the hash table interface uses the type @cpp{Scheme_Object*}
for both keys and values, the table functions never inspect values, for both keys and values, the table functions never inspect values,
@ -212,7 +212,7 @@ that will be encountered.}
@function[(Scheme_Hash_Table* scheme_make_hash_table_equal)]{ @function[(Scheme_Hash_Table* scheme_make_hash_table_equal)]{
Like @cpp{scheme_make_hash_table}, except that keys are treated as Like @cpp{scheme_make_hash_table}, except that keys are treated as
Scheme values and hashed based on @scheme[equal?] instead of Racket values and hashed based on @scheme[equal?] instead of
@scheme[eq?].} @scheme[eq?].}
@function[(void scheme_hash_set @function[(void scheme_hash_set
@ -334,8 +334,8 @@ Returns the current process ``time'' in milliseconds, just like
@function[(char* scheme_banner)]{ @function[(char* scheme_banner)]{
Returns the string that is used as the Scheme startup banner.} Returns the string that is used as the Racket startup banner.}
@function[(char* scheme_version)]{ @function[(char* scheme_version)]{
Returns a string for the executing version of Scheme.} Returns a string for the executing version of Racket.}

View File

@ -3,17 +3,17 @@
@title[#:tag "im:env"]{Namespaces and Modules} @title[#:tag "im:env"]{Namespaces and Modules}
A Scheme namespace (a top-level environment) is represented by a value A Racket namespace (a top-level environment) is represented by a value
of type @cppi{Scheme_Env*} --- which is also a Scheme value, castable of type @cppi{Scheme_Env*} --- which is also a Racket value, castable
to @cpp{Scheme_Object*}. Calling @cppi{scheme_basic_env} returns a to @cpp{Scheme_Object*}. Calling @cppi{scheme_basic_env} returns a
namespace that includes all of Scheme's standard global procedures namespace that includes all of Racket's standard global procedures
and syntax. and syntax.
The @cpp{scheme_basic_env} function must be called once by an The @cpp{scheme_basic_env} function must be called once by an
embedding program, before any other PLT Scheme function is called embedding program, before any other Racket function is called
(except @cpp{scheme_make_param}), but @cpp{scheme_main_setup} (except @cpp{scheme_make_param}), but @cpp{scheme_main_setup}
automatically calls @cpp{scheme_basic_env}. The returned namespace is automatically calls @cpp{scheme_basic_env}. The returned namespace is
the initial current namespace for the main Scheme thread. Scheme the initial current namespace for the main Racket thread. Racket
extensions cannot call @cpp{scheme_basic_env}. extensions cannot call @cpp{scheme_basic_env}.
The current thread's current namespace is available from The current thread's current namespace is available from
@ -22,7 +22,7 @@ The current thread's current namespace is available from
New values can be added as @as-index{globals} in a namespace using New values can be added as @as-index{globals} in a namespace using
@cppi{scheme_add_global}. The @cppi{scheme_lookup_global} function @cppi{scheme_add_global}. The @cppi{scheme_lookup_global} function
takes a Scheme symbol and returns the global value for that name, or takes a Racket symbol and returns the global value for that name, or
@cpp{NULL} if the symbol is undefined. @cpp{NULL} if the symbol is undefined.
A @as-index{module}'s set of top-level bindings is implemented using A @as-index{module}'s set of top-level bindings is implemented using
@ -37,8 +37,8 @@ module files). After installing variables into the module with
to make the module declaration available. All defined variables are to make the module declaration available. All defined variables are
exported from the primitive module. exported from the primitive module.
The Scheme @indexed-scheme[#%variable-reference] form produces a value The Racket @indexed-scheme[#%variable-reference] form produces a value
that is opaque to Scheme code. Use @cpp{SCHEME_PTR_VAL} on the result that is opaque to Racket code. Use @cpp{SCHEME_PTR_VAL} on the result
of @scheme[#%variable-reference] to obtain the same kind of value as of @scheme[#%variable-reference] to obtain the same kind of value as
returned by @cpp{scheme_global_bucket} (i.e., a bucket containing the returned by @cpp{scheme_global_bucket} (i.e., a bucket containing the
variable's value, or @cpp{NULL} if the variable is not yet defined). variable's value, or @cpp{NULL} if the variable is not yet defined).
@ -95,7 +95,7 @@ The @cppi{Scheme_Bucket} structure is defined as:
Like @cpp{scheme_global_bucket}, but finds a variable in a Like @cpp{scheme_global_bucket}, but finds a variable in a
module. The @var{mod} and @var{symbol} arguments are as for module. The @var{mod} and @var{symbol} arguments are as for
@scheme[dynamic-require] in Scheme. The @var{pos} argument should be @scheme[dynamic-require] in Racket. The @var{pos} argument should be
@cpp{-1} always. The @var{env} argument represents the namespace in @cpp{-1} always. The @var{env} argument represents the namespace in
which the module is declared.} which the module is declared.}

View File

@ -3,9 +3,9 @@
@title{Bignums, Rationals, and Complex Numbers} @title{Bignums, Rationals, and Complex Numbers}
Scheme supports integers of an arbitrary magnitude; when an integer Racket supports integers of an arbitrary magnitude; when an integer
cannot be represented as a fixnum (i.e., 30 or 62 bits plus a sign cannot be represented as a fixnum (i.e., 30 or 62 bits plus a sign
bit), then it is represented by the Scheme type bit), then it is represented by the Racket type
@cppi{scheme_bignum_type}. There is no overlap in integer values @cppi{scheme_bignum_type}. There is no overlap in integer values
represented by fixnums and bignums. represented by fixnums and bignums.
@ -60,7 +60,7 @@ unspecified accuracy.}
@function[(float scheme_bignum_to_float @function[(float scheme_bignum_to_float
[Scheme_Object* n])]{ [Scheme_Object* n])]{
If PLT Scheme is not compiled with single-precision floats, this procedure If Racket is not compiled with single-precision floats, this procedure
is actually a macro alias for @cpp{scheme_bignum_to_double}.} is actually a macro alias for @cpp{scheme_bignum_to_double}.}
@function[(Scheme_Object* scheme_bignum_from_double @function[(Scheme_Object* scheme_bignum_from_double
@ -72,7 +72,7 @@ number @var{d}. The conversion accuracy is reasonable but unspecified.}
@function[(Scheme_Object* scheme_bignum_from_float @function[(Scheme_Object* scheme_bignum_from_float
[float f])]{ [float f])]{
If PLT Scheme is not compiled with single-precision floats, this procedure If Racket is not compiled with single-precision floats, this procedure
is actually a macro alias for @cpp{scheme_bignum_from_double}.} is actually a macro alias for @cpp{scheme_bignum_from_double}.}
@function[(char* scheme_bignum_to_string @function[(char* scheme_bignum_to_string
@ -121,7 +121,7 @@ Converts the rational @var{n} to a @cpp{double}.}
@function[(float scheme_rational_to_float @function[(float scheme_rational_to_float
[Scheme_Object* n])]{ [Scheme_Object* n])]{
If PLT Scheme is not compiled with single-precision floats, this procedure If Racket is not compiled with single-precision floats, this procedure
is actually a macro alias for @cpp{scheme_rational_to_double}.} is actually a macro alias for @cpp{scheme_rational_to_double}.}
@function[(Scheme_Object* scheme_rational_numerator @function[(Scheme_Object* scheme_rational_numerator
@ -142,7 +142,7 @@ Converts the given @cpp{double} into a maximally-precise rational.}
@function[(Scheme_Object* scheme_rational_from_float @function[(Scheme_Object* scheme_rational_from_float
[float d])]{ [float d])]{
If PLT Scheme is not compiled with single-precision floats, this procedure If Racket is not compiled with single-precision floats, this procedure
is actually a macro alias for @cpp{scheme_rational_from_double}.} is actually a macro alias for @cpp{scheme_rational_from_double}.}
@function[(Scheme_Object* scheme_make_complex @function[(Scheme_Object* scheme_make_complex

View File

@ -3,21 +3,31 @@
@title[#:tag "overview"]{Overview} @title[#:tag "overview"]{Overview}
@section{``Scheme'' versus ``Racket''}
The old name for Racket was ``PLT Scheme,'' and the core compiler and
run-time system used to be called ``MzScheme.'' The old names are
entrenched in Racket internals, to the point that most C bindings
defined in this manual start with @cpp{scheme_}. They all should be
renamed to start @cpp{racket_}.
@; ----------------------------------------------------------------------
@section{CGC versus 3m} @section{CGC versus 3m}
Before mixing any C code with MzScheme, first decide whether to use Before mixing any C code with Racket, first decide whether to use the
the @bold{3m} variant of PLT Scheme, the @bold{CGC} variant of PLT @bold{3m} variant of Racket, the @bold{CGC} variant of Racket, or
Scheme, or both: both:
@itemize[ @itemize[
@item{@bold{@as-index{3m}} : the main variant of PLT Scheme, which @item{@bold{@as-index{3m}} : the main variant of Racket, which
uses @defterm{precise} garbage collection instead of conservative uses @defterm{precise} garbage collection instead of conservative
garbage collection, and it may move objects in memory during a garbage collection, and it may move objects in memory during a
collection.} collection.}
@item{@bold{@as-index{CGC}} : the original variant of PLT Scheme, @item{@bold{@as-index{CGC}} : the original variant of Racket, where
where memory management depends on a @defterm{conservative} garbage memory management depends on a @defterm{conservative} garbage
collector. The conservative garbage collector can automatically find collector. The conservative garbage collector can automatically find
references to managed values from C local variables and (on some references to managed values from C local variables and (on some
platforms) static variables.} platforms) static variables.}
@ -29,9 +39,9 @@ At the C level, working with CGC can be much easier than working with
@; ---------------------------------------------------------------------- @; ----------------------------------------------------------------------
@section{Writing MzScheme Extensions} @section{Writing Racket Extensions}
@section-index["extending MzScheme"] @section-index["extending Racket"]
The process of creating an extension for 3m or CGC is essentially the The process of creating an extension for 3m or CGC is essentially the
same, but the process for 3m is most easily understood as a variant of same, but the process for 3m is most easily understood as a variant of
@ -40,41 +50,41 @@ the process for CGC.
@subsection{CGC Extensions} @subsection{CGC Extensions}
To write a C/C++-based extension for PLT Scheme CGC, follow these To write a C/C++-based extension for Racket CGC, follow these
steps: steps:
@itemize[ @itemize[
@item{@index['("header files")]{For} each C/C++ file that uses PLT @item{@index['("header files")]{For} each C/C++ file that uses
Scheme library functions, @cpp{#include} the file Racket library functions, @cpp{#include} the file
@as-index{@filepath{escheme.h}}. @as-index{@filepath{escheme.h}}.
This file is distributed with the PLT software in an This file is distributed with the Racket software in an
@filepath{include} directory, but if @|mzc| is used to compile, this @filepath{include} directory, but if @|mzc| is used to
path is found automatically.} compile, this path is found automatically.}
@item{Define the C function @cppi{scheme_initialize}, which takes a @item{Define the C function @cppi{scheme_initialize}, which takes a
@cpp{Scheme_Env*} namespace (see @secref["im:env"]) and returns a @cpp{Scheme_Env*} namespace (see @secref["im:env"]) and returns a
@cpp{Scheme_Object*} Scheme value. @cpp{Scheme_Object*} Racket value.
This initialization function can install new global primitive This initialization function can install new global primitive
procedures or other values into the namespace, or it can simply procedures or other values into the namespace, or it can simply
return a Scheme value. The initialization function is called when the return a Racket value. The initialization function is called when the
extension is loaded with @scheme[load-extension] (the first time); extension is loaded with @racket[load-extension] (the first time);
the return value from @cpp{scheme_initialize} is used as the return the return value from @cpp{scheme_initialize} is used as the return
value for @scheme[load-extension]. The namespace provided to value for @racket[load-extension]. The namespace provided to
@cpp{scheme_initialize} is the current namespace when @cpp{scheme_initialize} is the current namespace when
@scheme[load-extension] is called.} @racket[load-extension] is called.}
@item{Define the C function @cppi{scheme_reload}, which has the same @item{Define the C function @cppi{scheme_reload}, which has the same
arguments and return type as @cpp{scheme_initialize}. arguments and return type as @cpp{scheme_initialize}.
This function is called if @scheme[load-extension] is called a second This function is called if @racket[load-extension] is called a second
time (or more times) for an extension. Like @cpp{scheme_initialize}, time (or more times) for an extension. Like @cpp{scheme_initialize},
the return value from this function is the return value for the return value from this function is the return value for
@scheme[load-extension].} @racket[load-extension].}
@item{Define the C function @cppi{scheme_module_name}, which takes @item{Define the C function @cppi{scheme_module_name}, which takes
@ -84,7 +94,7 @@ steps:
The function should return a symbol when the effect of calling The function should return a symbol when the effect of calling
@cpp{scheme_initialize} and @cpp{scheme_reload} is only to declare @cpp{scheme_initialize} and @cpp{scheme_reload} is only to declare
a module with the returned name. This function is called when the a module with the returned name. This function is called when the
extension is loaded to satisfy a @scheme[require] declaration. extension is loaded to satisfy a @racket[require] declaration.
The @cpp{scheme_module_name} function may be called before The @cpp{scheme_module_name} function may be called before
@cpp{scheme_initialize} and @cpp{scheme_reload}, after those @cpp{scheme_initialize} and @cpp{scheme_reload}, after those
@ -95,7 +105,7 @@ steps:
@item{Compile the extension C/C++ files to create platform-specific @item{Compile the extension C/C++ files to create platform-specific
object files. object files.
The @as-index{@|mzc|} compiler, which is distributed with PLT Scheme, The @as-index{@|mzc|} compiler, which is distributed with Racket,
compiles plain C files when the @as-index{@DFlag{cc}} flag is compiles plain C files when the @as-index{@DFlag{cc}} flag is
specified. More precisely, @|mzc| does not compile the files itself, specified. More precisely, @|mzc| does not compile the files itself,
but it locates a C compiler on the system and launches it with the but it locates a C compiler on the system and launches it with the
@ -104,7 +114,7 @@ steps:
compiler or @exec{gcc} in the path, or a Mac OS X system with Apple's compiler or @exec{gcc} in the path, or a Mac OS X system with Apple's
developer tools installed, then using @|mzc| is typically easier than developer tools installed, then using @|mzc| is typically easier than
working with the C compiler directly. Use the @as-index{@DFlag{cgc}} working with the C compiler directly. Use the @as-index{@DFlag{cgc}}
flag to indicate that the build is for use with PLT Scheme CGC.} flag to indicate that the build is for use with Racket CGC.}
@item{Link the extension C/C++ files with @item{Link the extension C/C++ files with
@ -115,50 +125,50 @@ steps:
The @filepath{mzdyn} object file is distributed in the installation's The @filepath{mzdyn} object file is distributed in the installation's
@filepath{lib} directory. For Windows, the object file is in a @filepath{lib} directory. For Windows, the object file is in a
compiler-specific sub-directory of @filepath{plt\lib}. compiler-specific sub-directory of @filepath{racket\lib}.
The @|mzc| compiler links object files into an extension when the The @|mzc| compiler links object files into an extension when the
@as-index{@DFlag{ld}} flag is specified, automatically locating @as-index{@DFlag{ld}} flag is specified, automatically locating
@filepath{mzdyn}. Again, use the @DFlag{cgc} flag with @|mzc|.} @filepath{mzdyn}. Again, use the @DFlag{cgc} flag with @|mzc|.}
@item{Load the shared object within Scheme using @item{Load the shared object within Racket using
@scheme[(load-extension _path)], where @scheme[_path] is the name of @racket[(load-extension _path)], where @racket[_path] is the name of
the extension file generated in the previous step. the extension file generated in the previous step.
Alternately, if the extension defines a module (i.e., Alternately, if the extension defines a module (i.e.,
@cpp{scheme_module_name} returns a symbol), then place the shared @cpp{scheme_module_name} returns a symbol), then place the shared
object in a special directory with a special name, so that it is object in a special directory with a special name, so that it is
detected by the module loader when @scheme[require] is used. The detected by the module loader when @racket[require] is used. The
special directory is a platform-specific path that can be obtained by special directory is a platform-specific path that can be obtained by
evaluating @scheme[(build-path "compiled" "native" evaluating @racket[(build-path "compiled" "native"
(system-library-subpath))]; see @scheme[load/use-compiled] for more (system-library-subpath))]; see @racket[load/use-compiled] for more
information. For example, if the shared object's name is information. For example, if the shared object's name is
@filepath{example_ss.dll}, then @scheme[(require "example.ss")] will @filepath{example_rkt.dll}, then @racket[(require "example.rkt")] will
be redirected to @filepath{example_ss.dll} if the latter is placed in be redirected to @filepath{example_rkt.dll} if the latter is placed in
the sub-directory @scheme[(build-path "compiled" "native" the sub-directory @racket[(build-path "compiled" "native"
(system-library-subpath))] and if @filepath{example.ss} does not (system-library-subpath))] and if @filepath{example.rkt} does not
exist or has an earlier timestamp. exist or has an earlier timestamp.
Note that @scheme[(load-extension _path)] within a @scheme[module] Note that @racket[(load-extension _path)] within a @racket[module]
does @italic{not} introduce the extension's definitions into the does @italic{not} introduce the extension's definitions into the
module, because @scheme[load-extension] is a run-time operation. To module, because @racket[load-extension] is a run-time operation. To
introduce an extension's bindings into a module, make sure that the introduce an extension's bindings into a module, make sure that the
extension defines a module, put the extension in the extension defines a module, put the extension in the
platform-specific location as described above, and use platform-specific location as described above, and use
@scheme[require].} @racket[require].}
] ]
@index['("allocation")]{@bold{IMPORTANT:}} With PLT Scheme CGC, Scheme @index['("allocation")]{@bold{IMPORTANT:}} With Racket CGC, Racket
values are garbage collected using a conservative garbage collector, values are garbage collected using a conservative garbage collector,
so pointers to Scheme objects can be kept in registers, stack so pointers to Racket objects can be kept in registers, stack
variables, or structures allocated with @cppi{scheme_malloc}. However, variables, or structures allocated with @cppi{scheme_malloc}. However,
static variables that contain pointers to collectable memory must be static variables that contain pointers to collectable memory must be
registered using @cppi{scheme_register_extension_global} (see registered using @cppi{scheme_register_extension_global} (see
@secref["im:memoryalloc"]). @secref["im:memoryalloc"]).
As an example, the following C code defines an extension that returns As an example, the following C code defines an extension that returns
@scheme["hello world"] when it is loaded: @racket["hello world"] when it is loaded:
@verbatim[#:indent 2]{ @verbatim[#:indent 2]{
#include "escheme.h" #include "escheme.h"
@ -176,18 +186,18 @@ As an example, the following C code defines an extension that returns
Assuming that this code is in the file @filepath{hw.c}, the extension Assuming that this code is in the file @filepath{hw.c}, the extension
is compiled under Unix with the following two commands: is compiled under Unix with the following two commands:
@commandline{mzc --cgc --cc hw.c} @commandline{raco ctool --cgc --cc hw.c}
@commandline{mzc --cgc --ld hw.so hw.o} @commandline{raco ctool --cgc --ld hw.so hw.o}
(Note that the @DFlag{cgc}, @DFlag{cc}, and @DFlag{ld} flags are each (Note that the @DFlag{cgc}, @DFlag{cc}, and @DFlag{ld} flags are each
prefixed by two dashes, not one.) prefixed by two dashes, not one.)
The @filepath{collects/mzscheme/examples} directory in the PLT The @filepath{collects/mzscheme/examples} directory in the Racket
distribution contains additional examples. distribution contains additional examples.
@subsection{3m Extensions} @subsection{3m Extensions}
To build an extension to work with PLT Scheme 3m, the CGC instructions To build an extension to work with Racket 3m, the CGC instructions
must be extended as follows: must be extended as follows:
@itemize[ @itemize[
@ -213,12 +223,12 @@ must be extended as follows:
For a relatively simple extension @filepath{hw.c}, the extension is For a relatively simple extension @filepath{hw.c}, the extension is
compiled under Unix for 3m with the following three commands: compiled under Unix for 3m with the following three commands:
@commandline{mzc --xform hw.c} @commandline{raco ctool --xform hw.c}
@commandline{mzc --3m --cc hw.3m.c} @commandline{raco ctool --3m --cc hw.3m.c}
@commandline{mzc --3m --ld hw.so hw.o} @commandline{raco ctool --3m --ld hw.so hw.o}
Some examples in @filepath{collects/mzscheme/examples} work with Some examples in @filepath{collects/mzscheme/examples} work with
MzScheme3m in this way. A few examples are manually instrumented, in Racket 3m in this way. A few examples are manually instrumented, in
which case the @DFlag{xform} step should be skipped. which case the @DFlag{xform} step should be skipped.
@subsection{Declaring a Module in an Extension} @subsection{Declaring a Module in an Extension}
@ -228,7 +238,7 @@ To create an extension that behaves as a module, return a symbol from
@cpp{scheme_rename} declare a module using @cpp{scheme_primitive_module}. @cpp{scheme_rename} declare a module using @cpp{scheme_primitive_module}.
For example, the following extension implements a module named For example, the following extension implements a module named
@scheme[hello] that exports a binding @scheme[greeting]: @racket[hello] that exports a binding @racket[greeting]:
@verbatim[#:indent 2]{ @verbatim[#:indent 2]{
#include "escheme.h" #include "escheme.h"
@ -253,96 +263,96 @@ For example, the following extension implements a module named
} }
} }
This extension could be compiled for 3m on Mac OS X for i386, for This extension could be compiled for 3m on i386 Linux, for
example, using the following sequence of @exec{mzc} commands: example, using the following sequence of @exec{mzc} commands:
@commandline{mzc --xform hi.c} @commandline{raco ctool --xform hi.c}
@commandline{mzc --3m --cc hi.3m.c} @commandline{raco ctool --3m --cc hi.3m.c}
@commandline{mkdir -p compiled/native/i386-macosx/3m} @commandline{mkdir -p compiled/native/i386-linux/3m}
@commandline{mzc --3m --ld compiled/native/i386-macosx/3m/hi_ss.dylib hi_3m.o} @commandline{raco ctool --3m --ld compiled/native/i386-linux/3m/hi_rkt.so hi_3m.o}
The resulting module can be loaded with The resulting module can be loaded with
@schemeblock[(require "hi.ss")] @racketblock[(require "hi.rkt")]
@; ---------------------------------------------------------------------- @; ----------------------------------------------------------------------
@section[#:tag "embedding"]{Embedding MzScheme into a Program} @section[#:tag "embedding"]{Embedding Racket into a Program}
@section-index["embedding MzScheme"] @section-index["embedding Racket"]
Like creating extensions, the embedding process for PLT Scheme CGC or Like creating extensions, the embedding process for Racket CGC or
PLT Scheme 3m is essentially the same, but the process for PLT Scheme Racket 3m is essentially the same, but the process for Racket
3m is most easily understood as a variant of the process for 3m is most easily understood as a variant of the process for
PLT Scheme CGC. Racket CGC.
@subsection{CGC Embedding} @subsection{CGC Embedding}
To embed PLT Scheme CGC in a program, follow these steps: To embed Racket CGC in a program, follow these steps:
@itemize[ @itemize[
@item{Locate or build the PLT Scheme CGC libraries. Since the @item{Locate or build the Racket CGC libraries. Since the
standard distribution provides 3m libraries, only, you will most standard distribution provides 3m libraries, only, you will most
likely have to build from source. likely have to build from source.
Under Unix, the libraries are @as-index{@filepath{libmzscheme.a}} Under Unix, the libraries are @as-index{@filepath{libracket.a}}
and @as-index{@filepath{libmzgc.a}} (or and @as-index{@filepath{libmzgc.a}} (or
@as-index{@filepath{libmzscheme.so}} and @as-index{@filepath{libracket.so}} and
@as-index{@filepath{libmzgc.so}} for a dynamic-library build, with @as-index{@filepath{libmzgc.so}} for a dynamic-library build, with
@as-index{@filepath{libmzscheme.la}} and @as-index{@filepath{libracket.la}} and
@as-index{@filepath{libmzgc.la}} files for use with @as-index{@filepath{libmzgc.la}} files for use with
@exec{libtool}). Building from source and installing places the @exec{libtool}). Building from source and installing places the
libraries into the installation's @filepath{lib} directory. Be sure libraries into the installation's @filepath{lib} directory. Be sure
to build the CGC variant, since the default is 3m. to build the CGC variant, since the default is 3m.
Under Windows, stub libraries for use with Microsoft tools are Under Windows, stub libraries for use with Microsoft tools are
@filepath{libmzsch@italic{x}.lib} and @filepath{libracket@italic{x}.lib} and
@filepath{libmzgc@italic{x}.lib} (where @italic{x} represents the @filepath{libmzgc@italic{x}.lib} (where @italic{x} represents the
version number) are in a compiler-specific directory in version number) are in a compiler-specific directory in
@filepath{plt\lib}. These libraries identify the bindings that are @filepath{racket\lib}. These libraries identify the bindings that are
provided by @filepath{libmzsch@italic{x}.dll} and provided by @filepath{libracket@italic{x}.dll} and
@filepath{libmzgc@italic{x}.dll} --- which are typically installed @filepath{libmzgc@italic{x}.dll} --- which are typically installed
in @filepath{plt\lib}. When linking with Cygwin, link to in @filepath{racket\lib}. When linking with Cygwin, link to
@filepath{libmzsch@italic{x}.dll} and @filepath{libracket@italic{x}.dll} and
@filepath{libmzgc@italic{x}.dll} directly. At run time, either @filepath{libmzgc@italic{x}.dll} directly. At run time, either
@filepath{libmzsch@italic{x}.dll} and @filepath{libracket@italic{x}.dll} and
@filepath{libmzgc@italic{x}.dll} must be moved to a location in the @filepath{libmzgc@italic{x}.dll} must be moved to a location in the
standard DLL search path, or your embedding application must standard DLL search path, or your embedding application must
``delayload'' link the DLLs and explicitly load them before ``delayload'' link the DLLs and explicitly load them before
use. (@filepath{MzScheme.exe} and @filepath{MrEd.exe} use the latter use. (@filepath{Racket.exe} and @filepath{MrEd.exe} use the latter
strategy.) strategy.)
Under Mac OS X, dynamic libraries are provided by the Under Mac OS X, dynamic libraries are provided by the
@filepath{PLT_MzScheme} framework, which is typically installed in @filepath{Racket} framework, which is typically installed in
@filepath{lib} sub-directory of the installation. Supply @filepath{lib} sub-directory of the installation. Supply
@exec{-framework PLT_MzScheme} to @exec{gcc} when linking, along @exec{-framework Racket} to @exec{gcc} when linking, along
with @exec{-F} and a path to the @filepath{lib} directory. Beware with @exec{-F} and a path to the @filepath{lib} directory. Beware
that CGC and 3m libraries are installed as different versions within that CGC and 3m libraries are installed as different versions within
a single framework, and installation marks one version or the other a single framework, and installation marks one version or the other
as the default (by setting symbolic links); install only CGC to as the default (by setting symbolic links); install only CGC to
simplify accessing the CGC version within the framework. At run simplify accessing the CGC version within the framework. At run
time, either @filepath{PLT_MzScheme.framework} must be moved to a time, either @filepath{Racket.framework} must be moved to a
location in the standard framework search path, or your embedding location in the standard framework search path, or your embedding
executable must provide a specific path to the framework (possibly executable must provide a specific path to the framework (possibly
an executable-relative path using the Mach-O @tt["@executable_path"] an executable-relative path using the Mach-O @tt["@executable_path"]
prefix).} prefix).}
@item{For each C/C++ file that uses MzScheme library functions, @item{For each C/C++ file that uses Racket library functions,
@cpp{#include} the file @as-index{@filepath{scheme.h}}. @cpp{#include} the file @as-index{@filepath{scheme.h}}.
The C preprocessor symbol @cppi{SCHEME_DIRECT_EMBEDDED} is defined The C preprocessor symbol @cppi{SCHEME_DIRECT_EMBEDDED} is defined
as @cpp{1} when @filepath{scheme.h} is @cpp{#include}d, or as as @cpp{1} when @filepath{scheme.h} is @cpp{#include}d, or as
@cpp{0} when @filepath{escheme.h} is @cpp{#include}d. @cpp{0} when @filepath{escheme.h} is @cpp{#include}d.
The @filepath{scheme.h} file is distributed with the PLT software in The @filepath{scheme.h} file is distributed with the Racket software in
the installation's @filepath{include} directory. Building and the installation's @filepath{include} directory. Building and
installing from source also places this file in the installation's installing from source also places this file in the installation's
@filepath{include} directory.} @filepath{include} directory.}
@item{Start your main program through the @cpp{scheme_main_setup} (or @item{Start your main program through the @cpp{scheme_main_setup} (or
@cpp{scheme_main_stack_setup}) trampoline, and put all uses of @cpp{scheme_main_stack_setup}) trampoline, and put all uses of
MzScheme functions inside the function passed to Racket functions inside the function passed to
@cpp{scheme_main_setup}. The @cpp{scheme_main_setup} function @cpp{scheme_main_setup}. The @cpp{scheme_main_setup} function
registers the current C stack location with the memory manager. It registers the current C stack location with the memory manager. It
also creates the initial namespace @cpp{Scheme_Env*} by calling also creates the initial namespace @cpp{Scheme_Env*} by calling
@ -353,11 +363,11 @@ To embed PLT Scheme CGC in a program, follow these steps:
@item{Configure the namespace by adding module declarations. The @item{Configure the namespace by adding module declarations. The
initial namespace contains declarations only for a few primitive initial namespace contains declarations only for a few primitive
modules, such as @scheme['#%kernel], and no bindings are imported modules, such as @racket['#%kernel], and no bindings are imported
into the top-level environment. into the top-level environment.
To embed a module like @schememodname[scheme/base] (along with all To embed a module like @racketmodname[racket/base] (along with all
its dependencies), use @exec{mzc --c-mods}, which generates a C file its dependencies), use @exec{raco ctool --c-mods}, which generates a C file
that contains modules in bytecode form as encapsulated in a static that contains modules in bytecode form as encapsulated in a static
array. The generated C file defines a @cppi{declare_modules} array. The generated C file defines a @cppi{declare_modules}
function that takes a @cpp{Scheme_Env*}, installs the modules into function that takes a @cpp{Scheme_Env*}, installs the modules into
@ -368,7 +378,7 @@ To embed PLT Scheme CGC in a program, follow these steps:
@cpp{scheme_init_collection_paths} to configure and install a path @cpp{scheme_init_collection_paths} to configure and install a path
for finding modules at run time.} for finding modules at run time.}
@item{Access Scheme through @cppi{scheme_dynamic_require}, @item{Access Racket through @cppi{scheme_dynamic_require},
@cppi{scheme_load}, @cppi{scheme_eval}, and/or other functions @cppi{scheme_load}, @cppi{scheme_eval}, and/or other functions
described in this manual. described in this manual.
@ -379,13 +389,13 @@ To embed PLT Scheme CGC in a program, follow these steps:
certain privileged operations, such as installing a @|PLaneT| certain privileged operations, such as installing a @|PLaneT|
package.} package.}
@item{Compile the program and link it with the MzScheme libraries.} @item{Compile the program and link it with the Racket libraries.}
] ]
@index['("allocation")]{With} PLT Scheme CGC, Scheme values are @index['("allocation")]{With} Racket CGC, Racket values are
garbage collected using a conservative garbage collector, so pointers garbage collected using a conservative garbage collector, so pointers
to Scheme objects can be kept in registers, stack variables, or to Racket objects can be kept in registers, stack variables, or
structures allocated with @cppi{scheme_malloc}. In an embedding structures allocated with @cppi{scheme_malloc}. In an embedding
application on some platforms, static variables are also automatically application on some platforms, static variables are also automatically
registered as roots for garbage collection (but see notes below registered as roots for garbage collection (but see notes below
@ -393,12 +403,12 @@ specific to Mac OS X and Windows).
For example, the following is a simple embedding program which For example, the following is a simple embedding program which
evaluates all expressions provided on the command line and displays evaluates all expressions provided on the command line and displays
the results, then runs a @scheme[read]-@scheme[eval]-@scheme[print] the results, then runs a @racket[read]-@racket[eval]-@racket[print]
loop. Run loop. Run
@commandline{mzc --c-mods base.c ++lib scheme/base} @commandline{raco ctool --c-mods base.c ++lib racket/base}
to generate @filepath{base.c}, which encapsulates @scheme[scheme/base] to generate @filepath{base.c}, which encapsulates @racket[racket/base]
and all of its transitive imports (so that they need not be found and all of its transitive imports (so that they need not be found
separately a run time). separately a run time).
@ -416,7 +426,7 @@ static int run(Scheme_Env *e, int argc, char *argv[])
/* Declare embedded modules in "base.c": */ /* Declare embedded modules in "base.c": */
declare_modules(e); declare_modules(e);
scheme_namespace_require(scheme_intern_symbol("scheme/base")); scheme_namespace_require(scheme_intern_symbol("racket/base"));
curout = scheme_get_param(scheme_current_config(), curout = scheme_get_param(scheme_current_config(),
MZCONFIG_OUTPUT_PORT); MZCONFIG_OUTPUT_PORT);
@ -433,7 +443,7 @@ static int run(Scheme_Env *e, int argc, char *argv[])
scheme_display(v, curout); scheme_display(v, curout);
scheme_display(scheme_make_char('\n'), curout); scheme_display(scheme_make_char('\n'), curout);
/* read-eval-print loop, uses initial Scheme_Env: */ /* read-eval-print loop, uses initial Scheme_Env: */
a[0] = scheme_intern_symbol("scheme/base"); a[0] = scheme_intern_symbol("racket/base");
a[1] = scheme_intern_symbol("read-eval-print-loop"); a[1] = scheme_intern_symbol("read-eval-print-loop");
scheme_apply(scheme_dynamic_require(2, a), 0, NULL); scheme_apply(scheme_dynamic_require(2, a), 0, NULL);
scheme_current_thread->error_buf = save; scheme_current_thread->error_buf = save;
@ -448,7 +458,7 @@ int main(int argc, char *argv[])
} }
} }
Under Mac OS X, or under Windows when MzScheme is compiled to a DLL Under Mac OS X, or under Windows when Racket is compiled to a DLL
using Cygwin, the garbage collector cannot find static variables using Cygwin, the garbage collector cannot find static variables
automatically. In that case, @cppi{scheme_main_setup} must be called with a automatically. In that case, @cppi{scheme_main_setup} must be called with a
non-zero first argument. non-zero first argument.
@ -467,7 +477,7 @@ pointer. For example, if @cpp{curout} above is made @cpp{static}, then
@cpp{MZ_REGISTER_STATIC(curout)} should be inserted before the call to @cpp{MZ_REGISTER_STATIC(curout)} should be inserted before the call to
@cpp{scheme_get_param}. @cpp{scheme_get_param}.
When building an embedded MzSchemeCGC to use SenoraGC (SGC) instead of When building an embedded Racket CGC to use SenoraGC (SGC) instead of
the default collector, @cpp{scheme_main_setup} must be called with a the default collector, @cpp{scheme_main_setup} must be called with a
non-zero first argument. See @secref["im:memoryalloc"] for more non-zero first argument. See @secref["im:memoryalloc"] for more
information. information.
@ -475,7 +485,7 @@ information.
@subsection{3m Embedding} @subsection{3m Embedding}
MzScheme3m can be embedded mostly the same as MzScheme, as long as the Racket 3m can be embedded mostly the same as Racket, as long as the
embedding program cooperates with the precise garbage collector as embedding program cooperates with the precise garbage collector as
described in @secref["im:3m"]. described in @secref["im:3m"].
@ -489,31 +499,31 @@ In addition, some library details are different:
@itemize[ @itemize[
@item{Under Unix, the library is just @item{Under Unix, the library is just
@as-index{@filepath{libmzscheme3m.a}} (or @as-index{@filepath{libracket3m.a}} (or
@as-index{@filepath{libmzscheme3m.so}} for a dynamic-library build, @as-index{@filepath{libracket3m.so}} for a dynamic-library build,
with @as-index{@filepath{libmzscheme3m.la}} for use with with @as-index{@filepath{libracket3m.la}} for use with
@exec{libtool}). There is no separate library for 3m analogous to @exec{libtool}). There is no separate library for 3m analogous to
CGC's @filepath{libmzgc.a}.} CGC's @filepath{libmzgc.a}.}
@item{Under Windows, the stub library for use with Microsoft tools is @item{Under Windows, the stub library for use with Microsoft tools is
@filepath{libmzsch3m@italic{x}.lib} (where @italic{x} represents the @filepath{libracket3m@italic{x}.lib} (where @italic{x} represents the
version number). This library identifies the bindings that are version number). This library identifies the bindings that are
provided by @filepath{libmzsch3m@italic{x}.dll}. There is no provided by @filepath{libracket3m@italic{x}.dll}. There is no
separate library for 3m analogous to CGC's separate library for 3m analogous to CGC's
@filepath{libmzgc@italic{x}.lib}.} @filepath{libmzgc@italic{x}.lib}.}
@item{Under Mac OS X, 3m dynamic libraries are provided by the @item{Under Mac OS X, 3m dynamic libraries are provided by the
@filepath{PLT_MzScheme} framework, just as for CGC, but as a version @filepath{Racket} framework, just as for CGC, but as a version
suffixed with @filepath{_3m}.} suffixed with @filepath{_3m}.}
] ]
For MzScheme3m, an embedding application must call @cpp{scheme_main_setup} For Racket 3m, an embedding application must call @cpp{scheme_main_setup}
with a non-zero first argument. with a non-zero first argument.
The simple embedding program from the previous section can be The simple embedding program from the previous section can be
processed by @exec{mzc --xform}, then compiled and linked with processed by @exec{raco ctool --xform}, then compiled and linked with
MzScheme3m. Alternately, the source code can be extended to work with Racket 3m. Alternately, the source code can be extended to work with
either CGC or 3m depending on whether @cpp{MZ_PRECISE_GC} is defined either CGC or 3m depending on whether @cpp{MZ_PRECISE_GC} is defined
on the compiler's command line: on the compiler's command line:
@ -541,7 +551,7 @@ static int run(Scheme_Env *e, int argc, char *argv[])
declare_modules(e); declare_modules(e);
v = scheme_intern_symbol("scheme/base"); v = scheme_intern_symbol("racket/base");
scheme_namespace_require(v); scheme_namespace_require(v);
config = scheme_current_config(); config = scheme_current_config();
@ -559,7 +569,7 @@ static int run(Scheme_Env *e, int argc, char *argv[])
v = scheme_make_char('\n'); v = scheme_make_char('\n');
scheme_display(v, curout); scheme_display(v, curout);
/* read-eval-print loop, uses initial Scheme_Env: */ /* read-eval-print loop, uses initial Scheme_Env: */
a[0] = scheme_intern_symbol("scheme/base"); a[0] = scheme_intern_symbol("racket/base");
a[1] = scheme_intern_symbol("read-eval-print-loop"); a[1] = scheme_intern_symbol("read-eval-print-loop");
v = scheme_dynamic_require(2, a); v = scheme_dynamic_require(2, a);
scheme_apply(v, 0, NULL); scheme_apply(v, 0, NULL);
@ -586,22 +596,22 @@ and when all temporary values are put into variables.
@; ---------------------------------------------------------------------- @; ----------------------------------------------------------------------
@section{MzScheme and Threads} @section{Racket and Threads}
MzScheme implements threads for Scheme programs without aid from the Racket implements threads for Racket programs without aid from the
operating system, so that MzScheme threads are cooperative from the operating system, so that Racket threads are cooperative from the
perspective of C code. Under Unix, stand-alone MzScheme uses a single perspective of C code. Under Unix, stand-alone Racket uses a single
OS-implemented thread. Under Windows and Mac OS X, stand-alone OS-implemented thread. Under Windows and Mac OS X, stand-alone
MzScheme uses a few private OS-implemented threads for background Racket uses a few private OS-implemented threads for background
tasks, but these OS-implemented threads are never exposed by the tasks, but these OS-implemented threads are never exposed by the
MzScheme API. Racket API.
In an embedding application, MzScheme can co-exist with additional In an embedding application, Racket can co-exist with additional
OS-implemented threads, but the additional OS threads must not call OS-implemented threads, but the additional OS threads must not call
any @cpp{scheme_} function. Only the OS thread that originally calls any @cpp{scheme_} function. Only the OS thread that originally calls
@cpp{scheme_basic_env} can call @cpp{scheme_} functions. (This @cpp{scheme_basic_env} can call @cpp{scheme_} functions. (This
restriction is stronger than saying all calls must be serialized restriction is stronger than saying all calls must be serialized
across threads. MzScheme relies on properties of specific threads to across threads. Racket relies on properties of specific threads to
avoid stack overflow and garbage collection.) When avoid stack overflow and garbage collection.) When
@cpp{scheme_basic_env} is called a second time to reset the @cpp{scheme_basic_env} is called a second time to reset the
interpreter, it can be called in an OS thread that is different from interpreter, it can be called in an OS thread that is different from
@ -609,19 +619,19 @@ the original call to @cpp{scheme_basic_env}. Thereafter, all calls to
@cpp{scheme_} functions must originate from the new thread. @cpp{scheme_} functions must originate from the new thread.
See @secref["threads"] for more information about threads, including See @secref["threads"] for more information about threads, including
the possible effects of MzScheme's thread implementation on extension the possible effects of Racket's thread implementation on extension
and embedding C code. and embedding C code.
@; ---------------------------------------------------------------------- @; ----------------------------------------------------------------------
@section[#:tag "im:unicode"]{MzScheme, Unicode, Characters, and Strings} @section[#:tag "im:unicode"]{Racket, Unicode, Characters, and Strings}
A character in MzScheme is a Unicode code point. In C, a character A character in Racket is a Unicode code point. In C, a character
value has type @cppi{mzchar}, which is an alias for @cpp{unsigned} --- value has type @cppi{mzchar}, which is an alias for @cpp{unsigned} ---
which is, in turn, 4 bytes for a properly compiled MzScheme. Thus, a which is, in turn, 4 bytes for a properly compiled Racket. Thus, a
@cpp{mzchar*} string is effectively a UCS-4 string. @cpp{mzchar*} string is effectively a UCS-4 string.
Only a few MzScheme functions use @cpp{mzchar*}. Instead, most Only a few Racket functions use @cpp{mzchar*}. Instead, most
functions accept @cpp{char*} strings. When such byte strings are to be functions accept @cpp{char*} strings. When such byte strings are to be
used as a character strings, they are interpreted as UTF-8 used as a character strings, they are interpreted as UTF-8
encodings. A plain ASCII string is always acceptable in such cases, encodings. A plain ASCII string is always acceptable in such cases,
@ -633,7 +643,7 @@ See also @secref["im:strings"] and @secref["im:encodings"].
@section[#:tag "im:intsize"]{Integers} @section[#:tag "im:intsize"]{Integers}
MzScheme expects to be compiled in a mode where @cppi{short} is a Racket expects to be compiled in a mode where @cppi{short} is a
16-bit integer, @cppi{int} is a 32-bit integer, and @cppi{long} has 16-bit integer, @cppi{int} is a 32-bit integer, and @cppi{long} has
the same number of bits as @cpp{void*}. The @cppi{mzlonglong} type has the same number of bits as @cpp{void*}. The @cppi{mzlonglong} type has
64 bits for compilers that support a 64-bit integer type, otherwise it 64 bits for compilers that support a 64-bit integer type, otherwise it

View File

@ -3,7 +3,7 @@
@title{Ports and the Filesystem} @title{Ports and the Filesystem}
Ports are represented as Scheme values with the types Ports are represented as Racket values with the types
@cppi{scheme_input_port_type} and @cppi{scheme_output_port_type}. The @cppi{scheme_input_port_type} and @cppi{scheme_output_port_type}. The
function @cppi{scheme_read} takes an input port value and returns the function @cppi{scheme_read} takes an input port value and returns the
next S-expression from the port. The function @cppi{scheme_write} next S-expression from the port. The function @cppi{scheme_write}
@ -23,7 +23,7 @@ The contents of a string output port are obtained with
Custom ports, with arbitrary read/write handlers, are created with Custom ports, with arbitrary read/write handlers, are created with
@cppi{scheme_make_input_port} and @cppi{scheme_make_output_port}. @cppi{scheme_make_input_port} and @cppi{scheme_make_output_port}.
When opening a file for any reason using a name provided from Scheme, When opening a file for any reason using a name provided from Racket,
use @cppi{scheme_expand_filename} to normalize the filename and use @cppi{scheme_expand_filename} to normalize the filename and
resolve relative paths. resolve relative paths.
@ -50,7 +50,7 @@ Like @cpp{scheme_write}, but the printing is truncated to @var{n} bytes.
[Scheme_Object* obj] [Scheme_Object* obj]
[Scheme_Object* port])]{ [Scheme_Object* port])]{
@scheme[display]s the Scheme value @var{obj} to the given output @scheme[display]s the Racket value @var{obj} to the given output
port.} port.}
@function[(void scheme_display_w_max @function[(void scheme_display_w_max
@ -119,7 +119,7 @@ without the non-blocking option.}
[Scheme_Object* obj] [Scheme_Object* obj]
[long* len])]{ [long* len])]{
Prints the Scheme value @var{obj} using @scheme[write] to a newly Prints the Racket value @var{obj} using @scheme[write] to a newly
allocated string. If @var{len} is not @cpp{NULL}, @cpp{*@var{len}} is allocated string. If @var{len} is not @cpp{NULL}, @cpp{*@var{len}} is
set to the length of the bytes string.} set to the length of the bytes string.}
@ -136,7 +136,7 @@ Like @cpp{scheme_write_to_string}, but the string is truncated to
[Scheme_Object* obj] [Scheme_Object* obj]
[long* len])]{ [long* len])]{
Prints the Scheme value @var{obj} using @scheme[display] to a newly Prints the Racket value @var{obj} using @scheme[display] to a newly
allocated string. If @var{len} is not @cpp{NULL}, @cpp{*@var{len}} is allocated string. If @var{len} is not @cpp{NULL}, @cpp{*@var{len}} is
set to the length of the string.} set to the length of the string.}
@ -154,7 +154,7 @@ Like @cpp{scheme_display_to_string}, but the string is truncated to
@function[(void scheme_debug_print @function[(void scheme_debug_print
[Scheme_Object* obj])]{ [Scheme_Object* obj])]{
Prints the Scheme value @var{obj} using @scheme[write] to the main Prints the Racket value @var{obj} using @scheme[write] to the main
thread's output port.} thread's output port.}
@function[(void scheme_flush_output @function[(void scheme_flush_output
@ -423,7 +423,7 @@ The functions are as follows.
in @var{unless} becomes ready before bytes can be read. In in @var{unless} becomes ready before bytes can be read. In
particular, @var{get_bytes_fun} should check the event in particular, @var{get_bytes_fun} should check the event in
@var{unless} before taking any action, and it should check the @var{unless} before taking any action, and it should check the
event in @var{unless} after any operation that may allow Scheme event in @var{unless} after any operation that may allow Racket
thread swaps. If the read must block, then it should unblock if thread swaps. If the read must block, then it should unblock if
the event in @var{unless} becomes ready. the event in @var{unless} becomes ready.
@ -439,7 +439,7 @@ The functions are as follows.
use @cpp{scheme_block_until_unless} instead of use @cpp{scheme_block_until_unless} instead of
@cpp{scheme_block_until}. Finally, in blocking mode, @cpp{scheme_block_until}. Finally, in blocking mode,
@var{get_bytes_fun} must return after immediately reading data, @var{get_bytes_fun} must return after immediately reading data,
without allowing a Scheme thread swap.} without allowing a Racket thread swap.}
@subfunction[(long peek_bytes_fun @subfunction[(long peek_bytes_fun
[Scheme_Input_Port* port] [Scheme_Input_Port* port]
@ -652,7 +652,7 @@ Opens @var{filename} for reading. In an exception is raised, the
[FILE* fp] [FILE* fp]
[Scheme_Object* name])]{ [Scheme_Object* name])]{
Creates a Scheme input file port from an ANSI C file pointer. The file Creates a Racket input file port from an ANSI C file pointer. The file
must never block on reads. The @var{name} argument is used as the must never block on reads. The @var{name} argument is used as the
port's name.} port's name.}
@ -667,7 +667,7 @@ Opens @var{filename} for writing in @scheme['truncate/replace] mode. If
@function[(Scheme_Object* scheme_make_file_output_port @function[(Scheme_Object* scheme_make_file_output_port
[FILE* fp])]{ [FILE* fp])]{
Creates a Scheme output file port from an ANSI C file pointer. The Creates a Racket output file port from an ANSI C file pointer. The
file must never block on writes.} file must never block on writes.}
@function[(Scheme_Object* scheme_make_fd_input_port @function[(Scheme_Object* scheme_make_fd_input_port
@ -676,7 +676,7 @@ Creates a Scheme output file port from an ANSI C file pointer. The
[int regfile] [int regfile]
[int win_textmode])]{ [int win_textmode])]{
Creates a Scheme input port for a file descriptor @var{fd}. Under Creates a Racket input port for a file descriptor @var{fd}. Under
Windows, @var{fd} can be a @cpp{HANDLE} for a stream, and it should Windows, @var{fd} can be a @cpp{HANDLE} for a stream, and it should
never be a file descriptor from the C library or a WinSock socket. never be a file descriptor from the C library or a WinSock socket.
@ -702,7 +702,7 @@ Instead of calling both @cpp{scheme_make_fd_input_port} and
[int win_textmode] [int win_textmode]
[int read_too])]{ [int read_too])]{
Creates a Scheme output port for a file descriptor @var{fd}. Under Creates a Racket output port for a file descriptor @var{fd}. Under
Windows, @var{fd} can be a @cpp{HANDLE} for a stream, and it should Windows, @var{fd} can be a @cpp{HANDLE} for a stream, and it should
never be a file descriptor from the C library or a WinSock socket. never be a file descriptor from the C library or a WinSock socket.
@ -729,7 +729,7 @@ If @var{read_too} is non-zero, the function produces multiple values
[Scheme_Object** inp] [Scheme_Object** inp]
[Scheme_Object** outp])]{ [Scheme_Object** outp])]{
Creates Scheme input and output ports for a TCP socket @var{s}. The Creates Racket input and output ports for a TCP socket @var{s}. The
@var{name} argument supplies the name for the ports. If @var{close} @var{name} argument supplies the name for the ports. If @var{close}
is non-zero, then the ports assume responsibility for closing the is non-zero, then the ports assume responsibility for closing the
socket. The resulting ports are written to @var{inp} and @var{outp}.} socket. The resulting ports are written to @var{inp} and @var{outp}.}
@ -737,13 +737,13 @@ Creates Scheme input and output ports for a TCP socket @var{s}. The
@function[(Scheme_Object* scheme_make_byte_string_input_port @function[(Scheme_Object* scheme_make_byte_string_input_port
[char* str])]{ [char* str])]{
Creates a Scheme input port from a byte string; successive Creates a Racket input port from a byte string; successive
@scheme[read-char]s on the port return successive bytes in the @scheme[read-char]s on the port return successive bytes in the
string.} string.}
@function[(Scheme_Object* scheme_make_byte_string_output_port)]{ @function[(Scheme_Object* scheme_make_byte_string_output_port)]{
Creates a Scheme output port; all writes to the port are kept in a byte string, Creates a Racket output port; all writes to the port are kept in a byte string,
which can be obtained with @cpp{scheme_get_byte_string_output}.} which can be obtained with @cpp{scheme_get_byte_string_output}.}
@function[(char* scheme_get_byte_string_output @function[(char* scheme_get_byte_string_output
@ -843,12 +843,12 @@ character string or a path value.}
@function[(Scheme_Object* scheme_char_string_to_path @function[(Scheme_Object* scheme_char_string_to_path
[Scheme_Object* s])]{ [Scheme_Object* s])]{
Converts a Scheme character string into a Scheme path value.} Converts a Racket character string into a Racket path value.}
@function[(Scheme_Object* scheme_path_to_char_string @function[(Scheme_Object* scheme_path_to_char_string
[Scheme_Object* s])]{ [Scheme_Object* s])]{
Converts a Scheme path value into a Scheme character string.} Converts a Racket path value into a Racket character string.}
@function[(Scheme_Object* scheme_make_path @function[(Scheme_Object* scheme_make_path
[char* bytes])]{ [char* bytes])]{
@ -923,7 +923,7 @@ no 0, then an exception is raised if the operation fails.}
[int noexn])]{ [int noexn])]{
Sets the current working directory according to the operating system. This Sets the current working directory according to the operating system. This
is separate from MzScheme's current directory parameter. is separate from Racket's current directory parameter.
If @var{noexn} is not 0, then an exception is raised if the operation If @var{noexn} is not 0, then an exception is raised if the operation
fails.} fails.}
@ -935,7 +935,7 @@ fails.}
[Scheme_Object** argv] [Scheme_Object** argv]
[long* rlen])]{ [long* rlen])]{
Creates a string like MzScheme's @scheme[format] procedure, using the Creates a string like Racket's @scheme[format] procedure, using the
format string @var{format} (of length @var{flen}) and the extra format string @var{format} (of length @var{flen}) and the extra
arguments specified in @var{argc} and @var{argv}. If @var{rlen} is not arguments specified in @var{argc} and @var{argv}. If @var{rlen} is not
@cpp{NULL}, @cpp{*@var{rlen}} is filled with the length of the @cpp{NULL}, @cpp{*@var{rlen}} is filled with the length of the
@ -947,7 +947,7 @@ resulting string.}
[int argc] [int argc]
[Scheme_Object** argv])]{ [Scheme_Object** argv])]{
Writes to the current output port like MzScheme's @scheme[printf] Writes to the current output port like Racket's @scheme[printf]
procedure, using the format string @var{format} (of length @var{flen}) procedure, using the format string @var{format} (of length @var{flen})
and the extra arguments specified in @var{argc} and @var{argv}.} and the extra arguments specified in @var{argc} and @var{argv}.}

View File

@ -3,11 +3,11 @@
@title{Procedures} @title{Procedures}
A @defterm{primitive procedure} is a Scheme-callable procedure that is A @defterm{primitive procedure} is a Racket-callable procedure that is
implemented in C. Primitive procedures are created in Scheme with implemented in C. Primitive procedures are created in Racket with
the function @cppi{scheme_make_prim_w_arity}, which takes a C function the function @cppi{scheme_make_prim_w_arity}, which takes a C function
pointer, the name of the primitive, and information about the number pointer, the name of the primitive, and information about the number
of Scheme arguments that it takes; it returns a Scheme procedure of Racket arguments that it takes; it returns a Racket procedure
value. value.
The C function implementing the procedure must take two arguments: an The C function implementing the procedure must take two arguments: an
@ -15,7 +15,7 @@ integer that specifies the number of arguments passed to the
procedure, and an array of @cpp{Scheme_Object*} arguments. The number procedure, and an array of @cpp{Scheme_Object*} arguments. The number
of arguments passed to the function will be checked using the arity of arguments passed to the function will be checked using the arity
information. (The arity information provided to information. (The arity information provided to
@cpp{scheme_make_prim_w_arity} is also used for the Scheme @cpp{scheme_make_prim_w_arity} is also used for the Racket
@scheme[arity] procedure.) The procedure implementation is not allowed @scheme[arity] procedure.) The procedure implementation is not allowed
to mutate the input array of arguments; as an exception, the procedure to mutate the input array of arguments; as an exception, the procedure
can mutate the array if it is the same a the result of can mutate the array if it is the same a the result of
@ -60,7 +60,7 @@ maximum number of arguments that can be supplied to the procedure, or
-1 if the procedure can take arbitrarily many arguments. The -1 if the procedure can take arbitrarily many arguments. The
@var{mina} and @var{maxa} values are used for automatically checking @var{mina} and @var{maxa} values are used for automatically checking
the argument count before the primitive is invoked, and also for the the argument count before the primitive is invoked, and also for the
Scheme @indexed-scheme[arity] procedure. The @var{name} argument is Racket @indexed-scheme[arity] procedure. The @var{name} argument is
used to report application arity errors at run-time.} used to report application arity errors at run-time.}
@function[(Scheme_Object* scheme_make_folding_prim @function[(Scheme_Object* scheme_make_folding_prim

View File

@ -3,7 +3,7 @@
@title{Structures} @title{Structures}
A new Scheme structure type is created with A new Racket structure type is created with
@cppi{scheme_make_struct_type}. This creates the structure type, but @cppi{scheme_make_struct_type}. This creates the structure type, but
does not generate the constructor, etc. procedures. The does not generate the constructor, etc. procedures. The
@cppi{scheme_make_struct_values} function takes a structure type and @cppi{scheme_make_struct_values} function takes a structure type and
@ -42,6 +42,10 @@ be restricted by passing any combination of these flags:
@item{@cppi{SCHEME_STRUCT_GEN_SET} --- the field-independent @item{@cppi{SCHEME_STRUCT_GEN_SET} --- the field-independent
mutator procedure value/name is returned.} mutator procedure value/name is returned.}
@item{@cppi{SCHEME_STRUCT_NO_MAKE_PREFIX} --- the constructor name
omits a @schemeidfont{make-} prefix, like @racket[struct] instead of
@racket[define-struct].}
] ]
When all values or names are returned, they are returned as an array When all values or names are returned, they are returned as an array
@ -87,7 +91,7 @@ Creates and returns an array of standard structure value name
symbols. The @var{base_name} argument is used as the name of the symbols. The @var{base_name} argument is used as the name of the
structure type; it should be the same symbol passed to the associated structure type; it should be the same symbol passed to the associated
call to @cpp{scheme_make_struct_type}. The @var{field_names} argument call to @cpp{scheme_make_struct_type}. The @var{field_names} argument
is a (Scheme) list of field name symbols. The @var{flags} argument is a (Racket) list of field name symbols. The @var{flags} argument
specifies which names should be generated, and if @var{count_out} is specifies which names should be generated, and if @var{count_out} is
not @cpp{NULL}, @var{count_out} is filled with the number of names not @cpp{NULL}, @var{count_out} is filled with the number of names
returned in the array.} returned in the array.}

View File

@ -5,10 +5,10 @@
@title[#:tag "threads"]{Threads} @title[#:tag "threads"]{Threads}
The initializer function @cppi{scheme_basic_env} creates the main The initializer function @cppi{scheme_basic_env} creates the main
Scheme thread; all other threads are created through calls to Racket thread; all other threads are created through calls to
@cppi{scheme_thread}. @cppi{scheme_thread}.
Information about each internal Scheme thread is kept in a Information about each internal Racket thread is kept in a
@cppi{Scheme_Thread} structure. A pointer to the current thread's @cppi{Scheme_Thread} structure. A pointer to the current thread's
structure is available as @cppi{scheme_current_thread}. A structure is available as @cppi{scheme_current_thread}. A
@cpp{Scheme_Thread} structure includes the following fields: @cpp{Scheme_Thread} structure includes the following fields:
@ -43,7 +43,7 @@ The last thread in the list is always the main thread.
@section{Integration with Threads} @section{Integration with Threads}
Scheme's threads can break external C code under two circumstances: Racket's threads can break external C code under two circumstances:
@itemize[ @itemize[
@ -53,18 +53,18 @@ Scheme's threads can break external C code under two circumstances:
pointer in the global variable, it may point to data that is not pointer in the global variable, it may point to data that is not
currently on the stack.} currently on the stack.}
@item{@italic{C functions that can invoke Scheme (and also be invoked @item{@italic{C functions that can invoke Racket (and also be invoked
by Scheme) depend on strict function-call nesting.} For example, by Racket) depend on strict function-call nesting.} For example,
suppose a function F uses an internal stack, pushing items on to the suppose a function F uses an internal stack, pushing items on to the
stack on entry and popping the same items on exit. Suppose also that stack on entry and popping the same items on exit. Suppose also that
F invokes Scheme to evaluate an expression. If the evaluation of F invokes Racket to evaluate an expression. If the evaluation of
this expression invokes F again in a new thread, but then returns to this expression invokes F again in a new thread, but then returns to
the first thread before completing the second F, then F's internal the first thread before completing the second F, then F's internal
stack will be corrupted.} stack will be corrupted.}
] ]
If either of these circumstances occurs, Scheme will probably crash. If either of these circumstances occurs, Racket will probably crash.
@; ---------------------------------------------------------------------- @; ----------------------------------------------------------------------
@ -72,8 +72,8 @@ If either of these circumstances occurs, Scheme will probably crash.
@section[#:tag "usefuel"]{Allowing Thread Switches} @section[#:tag "usefuel"]{Allowing Thread Switches}
C code that performs substantial or unbounded work should occasionally C code that performs substantial or unbounded work should occasionally
call @cppi{SCHEME_USE_FUEL}---actually a macro---which allows Scheme call @cppi{SCHEME_USE_FUEL}---actually a macro---which allows Racket
to swap in another Scheme thread to run, and to check for breaks on to swap in another Racket thread to run, and to check for breaks on
the current thread. In particular, if breaks are enabled, then the current thread. In particular, if breaks are enabled, then
@cpp{SCHEME_USE_FUEL} may trigger an exception. @cpp{SCHEME_USE_FUEL} may trigger an exception.
@ -110,18 +110,18 @@ expression.
@section[#:tag "threadblock"]{Blocking the Current Thread} @section[#:tag "threadblock"]{Blocking the Current Thread}
Embedding or extension code sometimes needs to block, but blocking Embedding or extension code sometimes needs to block, but blocking
should allow other Scheme threads to execute. To allow other threads should allow other Racket threads to execute. To allow other threads
to run, block using @cppi{scheme_block_until}. This procedure takes to run, block using @cppi{scheme_block_until}. This procedure takes
two functions: a polling function that tests whether the blocking two functions: a polling function that tests whether the blocking
operation can be completed, and a prepare-to-sleep function that sets operation can be completed, and a prepare-to-sleep function that sets
bits in @cpp{fd_set}s when Scheme decides to sleep (because all Scheme bits in @cpp{fd_set}s when Racket decides to sleep (because all Racket
threads are blocked). Under Windows, an ``@cpp{fd_set}'' can also threads are blocked). Under Windows, an ``@cpp{fd_set}'' can also
accommodate OS-level semaphores or other handles via accommodate OS-level semaphores or other handles via
@cpp{scheme_add_fd_handle}. @cpp{scheme_add_fd_handle}.
Since the functions passed to @cppi{scheme_block_until} are called by Since the functions passed to @cppi{scheme_block_until} are called by
the Scheme thread scheduler, they must never raise exceptions, call the Racket thread scheduler, they must never raise exceptions, call
@cpp{scheme_apply}, or trigger the evaluation of Scheme code in any @cpp{scheme_apply}, or trigger the evaluation of Racket code in any
way. The @cpp{scheme_block_until} function itself may call the current way. The @cpp{scheme_block_until} function itself may call the current
exception handler, however, in reaction to a break (if breaks are exception handler, however, in reaction to a break (if breaks are
enabled). enabled).
@ -133,8 +133,8 @@ polling and sleeping functions with @cppi{scheme_add_evt}, or register
a semaphore accessor with @cppi{scheme_add_evt_through_sema}. a semaphore accessor with @cppi{scheme_add_evt_through_sema}.
The @cppi{scheme_signal_received} function can be called to wake up The @cppi{scheme_signal_received} function can be called to wake up
Scheme when it is sleeping. In particular, calling Racket when it is sleeping. In particular, calling
@cppi{scheme_signal_received} ensures that Scheme will poll all @cppi{scheme_signal_received} ensures that Racket will poll all
blocking synchronizations soon afterward. Furthermore, blocking synchronizations soon afterward. Furthermore,
@cpp{scheme_signal_received} can be called from any OS-level thread. @cpp{scheme_signal_received} can be called from any OS-level thread.
Thus, when no adequate prepare-to-sleep function can be implemented Thus, when no adequate prepare-to-sleep function can be implemented
@ -144,17 +144,17 @@ changes will ensure that a poll is issued.
@; ---------------------------------------------------------------------- @; ----------------------------------------------------------------------
@section[#:tag "threadtime"]{Threads in Embedded Scheme with Event Loops} @section[#:tag "threadtime"]{Threads in Embedded Racket with Event Loops}
When Scheme is embedded in an application with an event-based model When Racket is embedded in an application with an event-based model
(i.e., the execution of Scheme code in the main thread is repeatedly (i.e., the execution of Racket code in the main thread is repeatedly
triggered by external events until the application exits) special triggered by external events until the application exits) special
hooks must be set to ensure that non-main threads execute hooks must be set to ensure that non-main threads execute
correctly. For example, during the execution in the main thread, a new correctly. For example, during the execution in the main thread, a new
thread may be created; the new thread may still be running when the thread may be created; the new thread may still be running when the
main thread returns to the event loop, and it may be arbitrarily long main thread returns to the event loop, and it may be arbitrarily long
before the main thread continues from the event loop. Under such before the main thread continues from the event loop. Under such
circumstances, the embedding program must explicitly allow Scheme to circumstances, the embedding program must explicitly allow Racket to
execute the non-main threads; this can be done by periodically calling execute the non-main threads; this can be done by periodically calling
the function @cppi{scheme_check_threads}. the function @cppi{scheme_check_threads}.
@ -167,11 +167,11 @@ when thread-checking becomes necessary, and then with 0 when thread
checking is no longer necessary. An embedding program can use this checking is no longer necessary. An embedding program can use this
information to prevent unnecessary @cpp{scheme_check_threads} polling. information to prevent unnecessary @cpp{scheme_check_threads} polling.
The below code illustrates how MrEd formerly set up The below code illustrates how GRacket formerly set up
@cpp{scheme_check_threads} polling using the wxWindows @cpp{wxTimer} @cpp{scheme_check_threads} polling using the wxWindows @cpp{wxTimer}
class. (Any regular event-loop-based callback is appropriate.) The class. (Any regular event-loop-based callback is appropriate.) The
@cpp{scheme_notify_multithread} pointer is set to @cpp{scheme_notify_multithread} pointer is set to
@cpp{MrEdInstallThreadTimer}. (MrEd no longer work this way, however.) @cpp{MrEdInstallThreadTimer}. (GRacket no longer work this way, however.)
@verbatim[#:indent 2]{ @verbatim[#:indent 2]{
class MrEdThreadTimer : public wxTimer class MrEdThreadTimer : public wxTimer
@ -208,15 +208,15 @@ class. (Any regular event-loop-based callback is appropriate.) The
} }
} }
An alternate architecture, which MrEd now uses, is to send the main An alternate architecture, which GRacket now uses, is to send the main
thread into a loop, which blocks until an event is ready to handle. thread into a loop, which blocks until an event is ready to handle.
Scheme automatically takes care of running all threads, and it does so Racket automatically takes care of running all threads, and it does so
efficiently because the main thread blocks on a file descriptor, as efficiently because the main thread blocks on a file descriptor, as
explained in @secref["threadblock"]. explained in @secref["threadblock"].
@subsection[#:tag "blockednonmainel"]{Callbacks for Blocked Threads} @subsection[#:tag "blockednonmainel"]{Callbacks for Blocked Threads}
Scheme threads are sometimes blocked on file descriptors, such as an Racket threads are sometimes blocked on file descriptors, such as an
input file or the X event socket. Blocked non-main threads do not input file or the X event socket. Blocked non-main threads do not
block the main thread, and therefore do not affect the event loop, so block the main thread, and therefore do not affect the event loop, so
@cppi{scheme_check_threads} is sufficient to implement this case @cppi{scheme_check_threads} is sufficient to implement this case
@ -237,7 +237,7 @@ sets up callbacks on the specified file descriptors. When input is
ready on any of those file descriptors, the callbacks are removed and ready on any of those file descriptors, the callbacks are removed and
@cpp{scheme_wake_up} is called. @cpp{scheme_wake_up} is called.
For example, the X Windows version of MrEd formerly set For example, the X Windows version of GRacket formerly set
@cpp{scheme_wakeup_on_input} to this @cpp{MrEdNeedWakeup}: @cpp{scheme_wakeup_on_input} to this @cpp{MrEdNeedWakeup}:
@verbatim[#:indent 2]{ @verbatim[#:indent 2]{
@ -319,15 +319,15 @@ For example, the X Windows version of MrEd formerly set
@; ---------------------------------------------------------------------- @; ----------------------------------------------------------------------
@section[#:tag "sleeping"]{Sleeping by Embedded Scheme} @section[#:tag "sleeping"]{Sleeping by Embedded Racket}
When all Scheme threads are blocked, Scheme must ``sleep'' for a When all Racket threads are blocked, Racket must ``sleep'' for a
certain number of seconds or until external input appears on some file certain number of seconds or until external input appears on some file
descriptor. Generally, sleeping should block the main event loop of descriptor. Generally, sleeping should block the main event loop of
the entire application. However, the way in which sleeping is the entire application. However, the way in which sleeping is
performed may depend on the embedding application. The global function performed may depend on the embedding application. The global function
pointer @cppi{scheme_sleep} can be set by an embedding application to pointer @cppi{scheme_sleep} can be set by an embedding application to
implement a blocking sleep, although Scheme implements this function implement a blocking sleep, although Racket implements this function
for you. for you.
A @cpp{scheme_sleep} function takes two arguments: a @cpp{float} and a A @cpp{scheme_sleep} function takes two arguments: a @cpp{float} and a
@ -348,7 +348,7 @@ manipulate each ``@cpp{fd_set}'' with @cpp{MZ_FD_SET},
The following function @cpp{mzsleep} is an appropriate The following function @cpp{mzsleep} is an appropriate
@cpp{scheme_sleep} function for most any Unix or Windows application. @cpp{scheme_sleep} function for most any Unix or Windows application.
(This is approximately the built-in sleep used by Scheme.) (This is approximately the built-in sleep used by Racket.)
@verbatim[#:indent 2]{ @verbatim[#:indent 2]{
void mzsleep(float v, void *fds) void mzsleep(float v, void *fds)
@ -490,7 +490,7 @@ Blocks the current thread until @var{f} with @var{data} returns a true
a @cpp{Scheme_Object*} value, because it is only used by @var{f} a @cpp{Scheme_Object*} value, because it is only used by @var{f}
and @var{fdf}.) and @var{fdf}.)
If Scheme decides to sleep, then the @var{fdf} function is called to If Racket decides to sleep, then the @var{fdf} function is called to
sets bits in @var{fds}, conceptually an array of three sets bits in @var{fds}, conceptually an array of three
@cpp{fd_set}s: one or reading, one for writing, and one for @cpp{fd_set}s: one or reading, one for writing, and one for
exceptions. Use @cpp{scheme_get_fdset} to get elements of this exceptions. Use @cpp{scheme_get_fdset} to get elements of this
@ -501,7 +501,7 @@ If Scheme decides to sleep, then the @var{fdf} function is called to
The @var{fdf} argument can be @cpp{NULL}, which implies that the thread The @var{fdf} argument can be @cpp{NULL}, which implies that the thread
becomes unblocked (i.e., @var{ready} changes its result to true) only becomes unblocked (i.e., @var{ready} changes its result to true) only
through Scheme actions, and never through external processes (e.g., through Racket actions, and never through external processes (e.g.,
through a socket or OS-level semaphore)---with the exception that through a socket or OS-level semaphore)---with the exception that
@cpp{scheme_signal_received} may be called to indicate an external @cpp{scheme_signal_received} may be called to indicate an external
change. change.
@ -548,8 +548,8 @@ Like @cpp{scheme_block_until_enable_break}, but the function
Indicates that an external event may have caused the result of a Indicates that an external event may have caused the result of a
synchronization poll to have a different result. Unlike most other synchronization poll to have a different result. Unlike most other
Scheme functions, this one can be called from any OS-level thread, and Racket functions, this one can be called from any OS-level thread, and
it wakes up if the Scheme thread if it is sleeping.} it wakes up if the Racket thread if it is sleeping.}
@function[(void scheme_check_threads)]{ @function[(void scheme_check_threads)]{
@ -577,12 +577,12 @@ Extracts an ``@cpp{fd_set}'' from an array passed to
[int repost])]{ [int repost])]{
Adds an OS-level semaphore (Windows) or other waitable handle Adds an OS-level semaphore (Windows) or other waitable handle
(Windows) to the ``@cpp{fd_set}'' @var{fds}. When Scheme performs (Windows) to the ``@cpp{fd_set}'' @var{fds}. When Racket performs
a ``@cpp{select}'' to sleep on @var{fds}, it also waits on the given a ``@cpp{select}'' to sleep on @var{fds}, it also waits on the given
semaphore or handle. This feature makes it possible for Scheme to semaphore or handle. This feature makes it possible for Racket to
sleep until it is awakened by an external process. sleep until it is awakened by an external process.
Scheme does not attempt to deallocate the given semaphore or handle, Racket does not attempt to deallocate the given semaphore or handle,
and the ``@cpp{select}'' call using @var{fds} may be unblocked due to and the ``@cpp{select}'' call using @var{fds} may be unblocked due to
some other file descriptor or handle in @var{fds}. If @var{repost} is some other file descriptor or handle in @var{fds}. If @var{repost} is
a true value, then @var{h} must be an OS-level semaphore, and if the a true value, then @var{h} must be an OS-level semaphore, and if the
@ -603,9 +603,9 @@ Under Unix and Mac OS X, this function has no effect.}
[int mask])]{ [int mask])]{
Adds an OS-level event type (Windows) to the set of types in the Adds an OS-level event type (Windows) to the set of types in the
``@cpp{fd_set}'' @var{fds}. When Scheme performs a ``@cpp{fd_set}'' @var{fds}. When Racket performs a
``@cpp{select}'' to sleep on @var{fds}, it also waits on events of ``@cpp{select}'' to sleep on @var{fds}, it also waits on events of
them specified type. This feature makes it possible for Scheme to them specified type. This feature makes it possible for Racket to
sleep until it is awakened by an external process. sleep until it is awakened by an external process.
The event mask is only used when some handle is installed with The event mask is only used when some handle is installed with
@ -711,28 +711,28 @@ Calls @var{prim} with the given @var{argc} and @var{argv} with breaks
[Scheme_Thread_Cell_Table* cells] [Scheme_Thread_Cell_Table* cells]
[Scheme_Object* v])]{ [Scheme_Object* v])]{
Prevents Scheme thread swaps until @cpp{scheme_end_atomic} or Prevents Racket thread swaps until @cpp{scheme_end_atomic} or
@cpp{scheme_end_atomic_no_swap} is called. Start-atomic and @cpp{scheme_end_atomic_no_swap} is called. Start-atomic and
end-atomic pairs can be nested.} end-atomic pairs can be nested.}
@function[(void scheme_end_atomic)]{ @function[(void scheme_end_atomic)]{
Ends an atomic region with respect to Scheme threads. The current Ends an atomic region with respect to Racket threads. The current
thread may be swapped out immediately (i.e., the call to thread may be swapped out immediately (i.e., the call to
@cpp{scheme_end_atomic} is assumed to be a safe point for thread @cpp{scheme_end_atomic} is assumed to be a safe point for thread
swaps).} swaps).}
@function[(void scheme_end_atomic_no_swap)]{ @function[(void scheme_end_atomic_no_swap)]{
Ends an atomic region with respect to Scheme threads, and also Ends an atomic region with respect to Racket threads, and also
prevents an immediate thread swap. (In other words, no Scheme prevents an immediate thread swap. (In other words, no Racket
thread swaps will occur until a future safe point.)} thread swaps will occur until a future safe point.)}
@function[(void scheme_add_swap_callback @function[(void scheme_add_swap_callback
[Scheme_Closure_Func f] [Scheme_Closure_Func f]
[Scheme_Object* data])]{ [Scheme_Object* data])]{
Registers a callback to be invoked just after a Scheme thread is Registers a callback to be invoked just after a Racket thread is
swapped in. The @var{data} is provided back to @var{f} when it is swapped in. The @var{data} is provided back to @var{f} when it is
called, where @cpp{Closure_Func} is defined as follows: called, where @cpp{Closure_Func} is defined as follows:
@ -745,4 +745,4 @@ called, where @cpp{Closure_Func} is defined as follows:
[Scheme_Object* data])]{ [Scheme_Object* data])]{
Like @cpp{scheme_add_swap_callback}, but registers a callback to be Like @cpp{scheme_add_swap_callback}, but registers a callback to be
invoked just before a Scheme thread is swapped out.} invoked just before a Racket thread is swapped out.}

View File

@ -152,7 +152,7 @@
(define cppdef (lambda (x) (as-cpp-defn x (cpp x)))) (define cppdef (lambda (x) (as-cpp-defn x (cpp x))))
(define *var italic) (define *var italic)
(define mzc (exec "mzc")) (define mzc (exec "raco ctool"))
(define (refsecref s) (define (refsecref s)
(secref #:doc '(lib "scribblings/reference/reference.scrbl") s)) (secref #:doc '(lib "scribblings/reference/reference.scrbl") s))

View File

@ -3,27 +3,27 @@
@title[#:tag "im:values+types"]{Values and Types} @title[#:tag "im:values+types"]{Values and Types}
A Scheme value is represented by a pointer-sized value. The low bit is A Racket value is represented by a pointer-sized value. The low bit is
a mark bit: a 1 in the low bit indicates an immediate integer, a 0 a mark bit: a 1 in the low bit indicates an immediate integer, a 0
indicates a (word-aligned) pointer. indicates a (word-aligned) pointer.
A pointer Scheme value references a structure that begins with a A pointer Racket value references a structure that begins with a
@cppi{Scheme_Object} sub-structure, which in turn starts with a tag @cppi{Scheme_Object} sub-structure, which in turn starts with a tag
that has the C type @cppi{Scheme_Type}. The rest of the structure, that has the C type @cppi{Scheme_Type}. The rest of the structure,
following the @cppi{Scheme_Object} header, is type-dependent. following the @cppi{Scheme_Object} header, is type-dependent.
PLT Scheme's C interface gives Scheme values the type Racket's C interface gives Racket values the type
@cpp{Scheme_Object*}. (The ``object'' here does not refer to objects @cpp{Scheme_Object*}. (The ``object'' here does not refer to objects
in the sense of the @schememodname[scheme/class] library.) in the sense of the @schememodname[racket/class] library.)
Examples of @cpp{Scheme_Type} values include @cpp{scheme_pair_type} Examples of @cpp{Scheme_Type} values include @cpp{scheme_pair_type}
and @cpp{scheme_symbol_type}. Some of these are implemented as and @cpp{scheme_symbol_type}. Some of these are implemented as
instances of @cppi{Scheme_Simple_Object}, which is defined in instances of @cppi{Scheme_Simple_Object}, which is defined in
@filepath{scheme.h}, but extension or embedding code should never access @filepath{scheme.h}, but extension or embedding code should never access
this structure directly. Instead, the code should use macros, such as this structure directly. Instead, the code should use macros, such as
@cpp{SCHEME_CAR}, that provide access to the data of common Scheme @cpp{SCHEME_CAR}, that provide access to the data of common Racket
types. types.
For most Scheme types, a constructor is provided for creating values For most Racket types, a constructor is provided for creating values
of the type. For example, @cpp{scheme_make_pair} takes two of the type. For example, @cpp{scheme_make_pair} takes two
@cpp{Scheme_Object*} values and returns the @scheme[cons] of the @cpp{Scheme_Object*} values and returns the @scheme[cons] of the
values. values.
@ -32,12 +32,12 @@ The macro @cppdef{SCHEME_TYPE} takes a @cpp{Scheme_Object *} and returns
the type of the object. This macro performs the tag-bit check, and the type of the object. This macro performs the tag-bit check, and
returns @cppi{scheme_integer_type} when the value is an immediate returns @cppi{scheme_integer_type} when the value is an immediate
integer; otherwise, @cpp{SCHEME_TYPE} follows the pointer to get the integer; otherwise, @cpp{SCHEME_TYPE} follows the pointer to get the
type tag. Macros are provided to test for common Scheme types; for type tag. Macros are provided to test for common Racket types; for
example, @cpp{SCHEME_PAIRP} returns @cpp{1} if the value is a cons example, @cpp{SCHEME_PAIRP} returns @cpp{1} if the value is a cons
cell, @cpp{0} otherwise. cell, @cpp{0} otherwise.
In addition to providing constructors, PLT Scheme defines six global In addition to providing constructors, Racket defines six global
constant Scheme values: @cppi{scheme_true}, @cppi{scheme_false}, constant Racket values: @cppi{scheme_true}, @cppi{scheme_false},
@cppi{scheme_null}, @cppi{scheme_eof}, @cppi{scheme_void}, and @cppi{scheme_null}, @cppi{scheme_eof}, @cppi{scheme_void}, and
@cppi{scheme_undefined}. Each of these has a type tag, but each is @cppi{scheme_undefined}. Each of these has a type tag, but each is
normally recognized via its constant address. normally recognized via its constant address.
@ -46,7 +46,7 @@ normally recognized via its constant address.
can create new a primitive data type by calling can create new a primitive data type by calling
@cppi{scheme_make_type}, which returns a fresh @cpp{Scheme_Type} @cppi{scheme_make_type}, which returns a fresh @cpp{Scheme_Type}
value. To create a collectable instance of this type, allocate memory value. To create a collectable instance of this type, allocate memory
for the instance with @cpp{scheme_malloc}. From PLT Scheme's for the instance with @cpp{scheme_malloc}. From Racket's
perspective, the main constraint on the data format of such an perspective, the main constraint on the data format of such an
instance is that the first @cpp{sizeof(Scheme_Object)} bytes must instance is that the first @cpp{sizeof(Scheme_Object)} bytes must
correspond to a @cpp{Scheme_Object} record; furthermore, the first correspond to a @cpp{Scheme_Object} record; furthermore, the first
@ -54,7 +54,7 @@ correspond to a @cpp{Scheme_Object} record; furthermore, the first
@cpp{scheme_make_type}. Extensions with modest needs can use @cpp{scheme_make_type}. Extensions with modest needs can use
@cppi{scheme_make_cptr}, instead of creating an entirely new type. @cppi{scheme_make_cptr}, instead of creating an entirely new type.
Scheme values should never be allocated on the stack, and they should Racket values should never be allocated on the stack, and they should
never contain pointers to values on the stack. Besides the problem of never contain pointers to values on the stack. Besides the problem of
restricting the value's lifetime to that of the stack frame, restricting the value's lifetime to that of the stack frame,
allocating values on the stack creates problems for continuations and allocating values on the stack creates problems for continuations and
@ -89,7 +89,7 @@ types:
floating-point value; test for this type with @cppdef{SCHEME_DBLP}} floating-point value; test for this type with @cppdef{SCHEME_DBLP}}
@item{@cppdef{scheme_float_type} --- single-precision flonum @item{@cppdef{scheme_float_type} --- single-precision flonum
inexact numbers, when specifically enabled when compiling PLT Scheme; inexact numbers, when specifically enabled when compiling Racket;
@cppi{SCHEME_FLOAT_VAL} or @cppdef{SCHEME_FLT_VAL} extracts the @cppi{SCHEME_FLOAT_VAL} or @cppdef{SCHEME_FLT_VAL} extracts the
floating-point value; test for this type with @cppdef{SCHEME_FLTP}} floating-point value; test for this type with @cppdef{SCHEME_FLTP}}
@ -109,7 +109,7 @@ types:
@item{@cppdef{scheme_char_string_type} --- @index['("strings" @item{@cppdef{scheme_char_string_type} --- @index['("strings"
"conversion to C")]{@cppdef{SCHEME_CHAR_STR_VAL}} extracts the string "conversion to C")]{@cppdef{SCHEME_CHAR_STR_VAL}} extracts the string
as a @cpp{mzchar*}; the string is always nul-terminated, but may also as a @cpp{mzchar*}; the string is always nul-terminated, but may also
contain embedded nul characters, and the Scheme string is modified if contain embedded nul characters, and the Racket string is modified if
this string is modified; @cppdef{SCHEME_CHAR_STRLEN_VAL} extracts the this string is modified; @cppdef{SCHEME_CHAR_STRLEN_VAL} extracts the
string length (in characters, not counting the nul terminator); test string length (in characters, not counting the nul terminator); test
for this type with @cppdef{SCHEME_CHAR_STRINGP}} for this type with @cppdef{SCHEME_CHAR_STRINGP}}
@ -117,7 +117,7 @@ types:
@item{@cppdef{scheme_byte_string_type} --- @item{@cppdef{scheme_byte_string_type} ---
@cppdef{SCHEME_BYTE_STR_VAL} extracts the string as a @cpp{char*}; the @cppdef{SCHEME_BYTE_STR_VAL} extracts the string as a @cpp{char*}; the
string is always nul-terminated, but may also contain embedded nul string is always nul-terminated, but may also contain embedded nul
characters, and the Scheme string is modified if this string is characters, and the Racket string is modified if this string is
modified; @cppdef{SCHEME_BYTE_STRLEN_VAL} extracts the string length modified; @cppdef{SCHEME_BYTE_STRLEN_VAL} extracts the string length
(in bytes, not counting the nul terminator); test for this type with (in bytes, not counting the nul terminator); test for this type with
@cppdef{SCHEME_BYTE_STRINGP}} @cppdef{SCHEME_BYTE_STRINGP}}
@ -158,7 +158,7 @@ types:
@item{@cppdef{scheme_vector_type} --- @cppdef{SCHEME_VEC_SIZE} @item{@cppdef{scheme_vector_type} --- @cppdef{SCHEME_VEC_SIZE}
extracts the length and @cppdef{SCHEME_VEC_ELS} extracts the array of extracts the length and @cppdef{SCHEME_VEC_ELS} extracts the array of
Scheme values (the Scheme vector is modified when this array is Racket values (the Racket vector is modified when this array is
modified); test for this type with @cppdef{SCHEME_VECTORP}; 3m: see modified); test for this type with @cppdef{SCHEME_VECTORP}; 3m: see
@secref["im:3m"] for a caution about @cppi{SCHEME_VEC_ELS}} @secref["im:3m"] for a caution about @cppi{SCHEME_VEC_ELS}}
@ -222,7 +222,7 @@ The following are the procedure types:
@item{@cppdef{scheme_closed_prim_type} --- an old-style primitive @item{@cppdef{scheme_closed_prim_type} --- an old-style primitive
procedure with a data pointer} procedure with a data pointer}
@item{@cppdef{scheme_compiled_closure_type} --- a Scheme @item{@cppdef{scheme_compiled_closure_type} --- a Racket
procedure} procedure}
@item{@cppdef{scheme_cont_type} --- a continuation} @item{@cppdef{scheme_cont_type} --- a continuation}
@ -289,9 +289,9 @@ There are six global constants:
@section[#:tag "im:strings"]{Strings} @section[#:tag "im:strings"]{Strings}
As noted in @secref["im:unicode"], a Scheme character is a Unicode As noted in @secref["im:unicode"], a Racket character is a Unicode
code point represented by a @cpp{mzchar} value, and character strings code point represented by a @cpp{mzchar} value, and character strings
are @cpp{mzchar} arrays. PLT Scheme also supplies byte strings, which are @cpp{mzchar} arrays. Racket also supplies byte strings, which
are @cpp{char} arrays. are @cpp{char} arrays.
For a character string @var{s}, @cpp{@cpp{SCHEME_CHAR_STR_VAL}(@var{s})} For a character string @var{s}, @cpp{@cpp{SCHEME_CHAR_STR_VAL}(@var{s})}
@ -319,7 +319,7 @@ For more fine-grained control over UTF-8 encoding, use the
Returns the character value. The @var{ch} value must be a legal Returns the character value. The @var{ch} value must be a legal
Unicode code point (and not a surrogate, for example). The first 256 Unicode code point (and not a surrogate, for example). The first 256
characters are represented by constant Scheme values, and others are characters are represented by constant Racket values, and others are
allocated.} allocated.}
@function[(Scheme_Object* scheme_make_char_or_null @function[(Scheme_Object* scheme_make_char_or_null
@ -389,7 +389,7 @@ Creates an integer given the high and low @cpp{long}s of an unsigned
Extracts the integer value. Unlike the @cppi{SCHEME_INT_VAL} macro, Extracts the integer value. Unlike the @cppi{SCHEME_INT_VAL} macro,
this procedure will extract an integer that fits in a @cpp{long} from this procedure will extract an integer that fits in a @cpp{long} from
a Scheme bignum. If @var{o} fits in a @cpp{long}, the extracted a Racket bignum. If @var{o} fits in a @cpp{long}, the extracted
integer is placed in @var{*i} and 1 is returned; otherwise, 0 is integer is placed in @var{*i} and 1 is returned; otherwise, 0 is
returned and @var{*i} is unmodified.} returned and @var{*i} is unmodified.}
@ -422,13 +422,13 @@ Creates a new floating-point value.}
[float d])]{ [float d])]{
Creates a new single-precision floating-point value. The procedure is Creates a new single-precision floating-point value. The procedure is
available only when PLT Scheme is compiled with single-precision available only when Racket is compiled with single-precision
numbers enabled.} numbers enabled.}
@function[(double scheme_real_to_double @function[(double scheme_real_to_double
[Scheme_Object* o])]{ [Scheme_Object* o])]{
Converts a Scheme real number to a double-precision floating-point Converts a Racket real number to a double-precision floating-point
value.} value.}
@function[(Scheme_Object* scheme_make_pair @function[(Scheme_Object* scheme_make_pair
@ -440,7 +440,7 @@ Makes a @scheme[cons] pair.}
@function[(Scheme_Object* scheme_make_byte_string @function[(Scheme_Object* scheme_make_byte_string
[char* bytes])]{ [char* bytes])]{
Makes a Scheme byte string from a nul-terminated C string. The Makes a Racket byte string from a nul-terminated C string. The
@var{bytes} string is copied.} @var{bytes} string is copied.}
@function[(Scheme_Object* scheme_make_byte_string_without_copying @function[(Scheme_Object* scheme_make_byte_string_without_copying
@ -475,7 +475,7 @@ Like @cpp{scheme_make_sized_byte_string}, except the @var{len}
[long size] [long size]
[char fill])]{ [char fill])]{
Allocates a new Scheme byte string.} Allocates a new Racket byte string.}
@function[(Scheme_Object* scheme_append_byte_string @function[(Scheme_Object* scheme_append_byte_string
[Scheme_Object* a] [Scheme_Object* a]
@ -486,7 +486,7 @@ Creates a new byte string by appending the two given byte strings.}
@function[(Scheme_Object* scheme_make_locale_string @function[(Scheme_Object* scheme_make_locale_string
[char* bytes])]{ [char* bytes])]{
Makes a Scheme string from a nul-terminated byte string that is a Makes a Racket string from a nul-terminated byte string that is a
locale-specific encoding of a character string; a new string is locale-specific encoding of a character string; a new string is
allocated during decoding. The ``locale in the name of this function allocated during decoding. The ``locale in the name of this function
thus refers to @var{bytes}, and not the resulting string (which is thus refers to @var{bytes}, and not the resulting string (which is
@ -495,7 +495,7 @@ Makes a Scheme string from a nul-terminated byte string that is a
@function[(Scheme_Object* scheme_make_utf8_string @function[(Scheme_Object* scheme_make_utf8_string
[char* bytes])]{ [char* bytes])]{
Makes a Scheme string from a nul-terminated byte string that is a Makes a Racket string from a nul-terminated byte string that is a
UTF-8 encoding. A new string is allocated during decoding. The UTF-8 encoding. A new string is allocated during decoding. The
``utf8'' in the name of this function thus refers to @var{bytes}, and ``utf8'' in the name of this function thus refers to @var{bytes}, and
not the resulting string (which is internally stored as UCS-4).} not the resulting string (which is internally stored as UCS-4).}
@ -523,7 +523,7 @@ Like @cpp{scheme_make_sized_char_string}, except the @var{len} characters
@function[(Scheme_Object* scheme_make_char_string @function[(Scheme_Object* scheme_make_char_string
[mzchar* chars])]{ [mzchar* chars])]{
Makes a Scheme string from a nul-terminated UCS-4 string. The Makes a Racket string from a nul-terminated UCS-4 string. The
@var{chars} string is copied.} @var{chars} string is copied.}
@function[(Scheme_Object* scheme_make_char_string_without_copying @function[(Scheme_Object* scheme_make_char_string_without_copying
@ -558,7 +558,7 @@ Like @cpp{scheme_make_sized_char_string}, except the @var{len}
[long size] [long size]
[mzchar fill])]{ [mzchar fill])]{
Allocates a new Scheme string.} Allocates a new Racket string.}
@function[(Scheme_Object* scheme_append_char_string @function[(Scheme_Object* scheme_append_char_string
[Scheme_Object* a] [Scheme_Object* a]
@ -569,22 +569,22 @@ Creates a new string by appending the two given strings.}
@function[(Scheme_Object* scheme_char_string_to_byte_string @function[(Scheme_Object* scheme_char_string_to_byte_string
[Scheme_Object* s])]{ [Scheme_Object* s])]{
Converts a Scheme character string into a Scheme byte string via UTF-8.} Converts a Racket character string into a Racket byte string via UTF-8.}
@function[(Scheme_Object* scheme_byte_string_to_char_string @function[(Scheme_Object* scheme_byte_string_to_char_string
[Scheme_Object* s])]{ [Scheme_Object* s])]{
Converts a Scheme byte string into a Scheme character string via UTF-8.} Converts a Racket byte string into a Racket character string via UTF-8.}
@function[(Scheme_Object* scheme_char_string_to_byte_string_locale @function[(Scheme_Object* scheme_char_string_to_byte_string_locale
[Scheme_Object* s])]{ [Scheme_Object* s])]{
Converts a Scheme character string into a Scheme byte string via the locale's encoding.} Converts a Racket character string into a Racket byte string via the locale's encoding.}
@function[(Scheme_Object* scheme_byte_string_to_char_string_locale @function[(Scheme_Object* scheme_byte_string_to_char_string_locale
[Scheme_Object* s])]{ [Scheme_Object* s])]{
Converts a Scheme byte string into a Scheme character string via the locale's encoding.} Converts a Racket byte string into a Racket character string via the locale's encoding.}
@function[(Scheme_Object* scheme_intern_symbol @function[(Scheme_Object* scheme_intern_symbol
[char* name])]{ [char* name])]{
@ -654,7 +654,7 @@ Creates a new weak box containing the value @var{v}.}
@function[(Scheme_Type scheme_make_type @function[(Scheme_Type scheme_make_type
[char* name])]{ [char* name])]{
Creates a new type (not a Scheme value).} Creates a new type (not a Racket value).}
@function[(Scheme_Object* scheme_make_cptr @function[(Scheme_Object* scheme_make_cptr
[void* ptr] [void* ptr]
@ -664,10 +664,10 @@ Creates a C-pointer object that encapsulates @var{ptr} and uses
@var{typetag} to identify the type of the pointer. The @var{typetag} to identify the type of the pointer. The
@cppi{SCHEME_CPTRP} macro recognizes objects created by @cppi{SCHEME_CPTRP} macro recognizes objects created by
@cpp{scheme_make_cptr}. The @cppi{SCHEME_CPTR_VAL} macro extracts @cpp{scheme_make_cptr}. The @cppi{SCHEME_CPTR_VAL} macro extracts
the original @var{ptr} from the Scheme object, and the original @var{ptr} from the Racket object, and
@cppi{SCHEME_CPTR_TYPE} extracts the type tag. @cppi{SCHEME_CPTR_TYPE} extracts the type tag.
The @cppi{SCHEME_CPTR_OFFSETVAL} macro returns @cpp{0} The @cppi{SCHEME_CPTR_OFFSETVAL} macro returns @cpp{0}
for the result Scheme object. for the result Racket object.
The @var{ptr} can refer to either memory managed by the garbage The @var{ptr} can refer to either memory managed by the garbage
collector or by some other memory manager. Beware, however, of collector or by some other memory manager. Beware, however, of
@ -690,7 +690,7 @@ referencing memory managed by the garbage collector.}
Creates a C-pointer object that encapsulates both @var{ptr} and @var{offset}. Creates a C-pointer object that encapsulates both @var{ptr} and @var{offset}.
The @cppi{SCHEME_CPTR_OFFSETVAL} macro returns @var{offset} The @cppi{SCHEME_CPTR_OFFSETVAL} macro returns @var{offset}
for the result Scheme object (and the macro be used to change the offset, for the result Racket object (and the macro be used to change the offset,
since it also works on objects with no offset). since it also works on objects with no offset).
The @var{ptr} can refer to either memory managed by the garbage The @var{ptr} can refer to either memory managed by the garbage