2003-10-27 17:08:10 -05:00
|
|
|
'Banana' is a simple object serialization protocol.
|
2003-03-28 14:47:41 -05:00
|
|
|
|
|
|
|
- Main Procedures -
|
|
|
|
|
|
|
|
(encode value [profile]) ==> byte-vector [procedure]
|
|
|
|
Turns a value into a byte-vector representing that value.
|
|
|
|
Generally, the 'none' profile is used (and PROFILE defaults to
|
|
|
|
PROFILE/NONE), and with that one can encode only integers
|
|
|
|
(positive, zero, and negative, and of any size), lists, strings,
|
|
|
|
and reals (*FIXME* Real number encoding and decoding doesn't
|
|
|
|
work right now -- I haven't a clue how to encode them in the
|
|
|
|
IEEE floating point format, which is what Banana requires).
|
|
|
|
Example:
|
|
|
|
(encode '(1 -1 ("hello")))
|
|
|
|
(not printed as byte-vectors would normally print; this is
|
|
|
|
just how Banana output is ordinarily shown)
|
|
|
|
==> 03 80 01 81 01 83 01 80 05 82 68 65 6c 6c 6c 6f
|
|
|
|
|
|
|
|
(decode input-port/string/byte-vector [profile]) [procedure]
|
|
|
|
==> value
|
|
|
|
Decodes the output of ENCODE, or reads similar output from an
|
|
|
|
input port, or processes a string similarly.
|
|
|
|
Example:
|
|
|
|
(decode (encode '(1 -1 ("hello"))))
|
|
|
|
==> (1 -1 ("hello"))
|
|
|
|
|
|
|
|
(etb? byte) [procedure]
|
|
|
|
==> boolean
|
2003-10-27 17:08:10 -05:00
|
|
|
Returns #T if BYTE > 127 (#x7f), #F if otherwise. BYTE must be
|
2003-03-28 14:47:41 -05:00
|
|
|
an exact integer.
|
|
|
|
|
|
|
|
- Exceptions -
|
|
|
|
|
|
|
|
banana-error <-- error [condition type]
|
|
|
|
Subtypes of BANANA-ERROR are raised whenever anything involving
|
|
|
|
Banana-ing goes wrong. The procedure that raised the error is
|
|
|
|
stored in each BANANA-ERROR condition, too, accessed by
|
|
|
|
BANANA-ERROR-CALLER.
|
|
|
|
|
|
|
|
(banana-error? value) [condition type predicate]
|
|
|
|
|
|
|
|
(banana-error-caller banana-error) ==> symbol [procedure]
|
|
|
|
Returns the name of the procedure that raised BANANA-ERROR.
|
|
|
|
|
|
|
|
banana:unknown-byte <-- banana-error [condition type]
|
|
|
|
Raised when DECODE encounters an element type byte (see the
|
|
|
|
Banana specification on http://twistedmatrix.com/ for what the
|
|
|
|
element type bytes are) that it can't find in the profile it was
|
|
|
|
passed.
|
|
|
|
|
|
|
|
(unknown-byte-error? value) [condition type predicate]
|
|
|
|
|
|
|
|
(unknown-byte-error-byte banana:unknown-byte) ==> byte [procedure]
|
2003-10-27 17:08:10 -05:00
|
|
|
Returns the byte that DECODE didn't recognize.
|
2003-03-28 14:47:41 -05:00
|
|
|
|
|
|
|
(unknown-byte-error-profile banana:unknown-byte) [procedure]
|
|
|
|
==> profile
|
|
|
|
Returns the profile that DECODE was searching through.
|
|
|
|
|
|
|
|
banana:unsupported-type <-- banana-error [condition type]
|
|
|
|
Raised when a profile's encoder doesn't know how to Banana a
|
|
|
|
value of a certain type.
|
|
|
|
|
|
|
|
(unsupported-type-error? value) [condition type predicate]
|
|
|
|
|
|
|
|
(unsupported-type-error-type banana:unsupported-type) [procedure]
|
|
|
|
==> string
|
|
|
|
Returns the name of the type that a profile's encoder didn't
|
|
|
|
support.
|
|
|
|
|
|
|
|
(unsupported-type-error-value banana:unsupported-type) [procedure]
|
|
|
|
==> value
|
|
|
|
Returns the value of that type that a profile's encoder didn't
|
|
|
|
support.
|
|
|
|
|
|
|
|
read-eof-error <-- read-error [condition type]
|
|
|
|
Raised when an EOF is reached and was not expected.
|
|
|
|
|
|
|
|
- Profiles -
|
|
|
|
|
|
|
|
Profiles are ways to extend the Banana protocol. See the Banana
|
|
|
|
specification for how they work in Banana.
|
|
|
|
|
|
|
|
:profile [record type]
|
|
|
|
Profiles are stored in instances of this. They have four
|
|
|
|
fields, accessed by similar names --
|
|
|
|
name -- profile-name
|
|
|
|
encoder -- profile-encoder
|
|
|
|
decoder-table -- profile-decoder-table
|
2003-10-27 17:08:10 -05:00
|
|
|
parent -- profile-parent
|
2003-03-28 14:47:41 -05:00
|
|
|
|
|
|
|
NAME is mainly for debugging purposes.
|
|
|
|
|
|
|
|
ENCODER should be a procedure of one argument and should return
|
|
|
|
a byte vector.
|
|
|
|
|
|
|
|
DECODER-TABLE is a table of element type bytes to procedures of
|
|
|
|
two arguments.
|
|
|
|
|
2003-10-27 17:08:10 -05:00
|
|
|
PARENT is either #F (indicating no parent) or a profile from
|
|
|
|
which another profile can inherit element type byte decoders and
|
|
|
|
such.
|
2003-03-28 14:47:41 -05:00
|
|
|
|
|
|
|
(make-profile string proc alist) [procedure]
|
|
|
|
Makes a profile, whose name is STRING, whose encoder is PROC,
|
|
|
|
and whose decoder table is a table made from ALIST, which should
|
|
|
|
be a list of pairs, the CAR of each being an element type byte,
|
|
|
|
and the CDR of each being a decoder procedure.
|
|
|
|
|
|
|
|
(extend-profile profile string proc alist) [procedure]
|
|
|
|
The preferred profile constructor, this one allows you to make a
|
|
|
|
profile that inherits behaviour from another profile, but is
|
|
|
|
otherwise just like MAKE-PROFILE.
|
|
|
|
|
2003-10-27 17:08:10 -05:00
|
|
|
The BANANA-EXTRAS package includes a couple prettifying procedures
|
2003-03-28 14:47:41 -05:00
|
|
|
and a couple useful procedures should one desire to extend Banana.
|
|
|
|
|
|
|
|
(posint->byte-vector nonnegative-integer) [procedure]
|
|
|
|
The name is slightly misleading, since it also works on zero,
|
|
|
|
but in any case, it returns a byte vector of NONNEGATIVE-INTEGER
|
|
|
|
encoded as the Banana specification states. Note that it does
|
|
|
|
-not- produce a byte vector with the PROFILE/NONE element type
|
|
|
|
byte for nonnegative integers.
|
|
|
|
|
|
|
|
(byte-vector->posint byte-vector) [procedure]
|
2003-10-27 17:08:10 -05:00
|
|
|
The converse of POSINT->BYTE-VECTOR.
|
2003-03-28 14:47:41 -05:00
|
|
|
|
|
|
|
(prettify-byte byte) [procedure]
|
|
|
|
Makes BYTE look like it normally does when being described in
|
|
|
|
the context of Banana.
|
|
|
|
|
|
|
|
(prettify-byte-vector byte-vector) [procedure]
|
|
|
|
Returns a list of prettified bytes in BYTE-VECTOR.
|