Next: Introduction, Previous: (dir), Up: (dir) [Contents][Index]
This is the lichat-protocol Reference Manual, version 1.5, generated automatically by Declt version 3.0 "Montgomery Scott" on Tue Dec 22 13:59:50 2020 GMT+0.
• Introduction | What lichat-protocol is all about | |
• Systems | The systems documentation | |
• Files | The files documentation | |
• Packages | The packages documentation | |
• Definitions | The symbols documentation | |
• Indexes | Concepts, functions, variables and data types |
This system specifies and implements the protocol of the Lichat chat system. It offers both verbal and programmatical descriptions of the protocol. If you are working with a Common Lisp system, you can use this system straight-away to process Lichat messages.
The wire format is based on UTF-8 character streams on which objects are serialised in a secure, simplified s-expression format. The format is as follows:
WIREABLE ::= OBJECT | STRING | SYMBOL | NUMBER
OBJECT ::= '(' WHITE* SYMBOL (WHITE+ KEYWORD WHITE+ EXPR)* WHITE* ')'
EXPR ::= STRING | LIST | SYMBOL | NUMBER
STRING ::= '"' ('\' ANY | !('"' | NULL))* '"'
LIST ::= '(' WHITE* (EXPR (WHITE+ EXPR)*)? WHITE* ')'
SYMBOL ::= KEYWORD | '#' ':' NAME | NAME ':' NAME
KEYWORD ::= ':' NAME
NUMBER ::= '0..9'+ ( '.' '0..9'*)? | '.' '0..9'*
NAME ::= (('\' ANY) | !(TERMINAL | NULL))+
TERMINAL ::= ('0..9' | ':' | ' ' | '"' | '.' | '(' | ')')
WHITE ::= U+0009 | U+000A | U+000B | U+000C | U+000D | U+0020
NULL ::= U+0000
ANY ::= !NULL
See to-wire
, from-wire
.
Special care must be taken when reading and printing symbols. Symbols that come from the lichat-protocol
package must be printed without the package name prefix. Symbols from the keyword
package must be printed by their name only prefixed by a :
. Symbols without a package must be printed by their name only and prefixed by a #:
. Every other symbol must be prefixed by the symbol's package's name followed by a :
. When a symbol is read, it is checked whether it exists in the corresponding package laid out by the previous rules. If it does not exist, the expression is not valid and an error must be generated, but only after the expression has been read to completion.
Only Common Lisp objects of type wireable
can be serialised to the wire format. Special care must also be taken when wire-object
s are read from the wire. An error must be generated if the object is malformed by either a non-symbol in the first place of its list, imbalanced key/value pairs in the tail, or non-keywords in the key position. An error must also be generated if the symbol at the first position does not name a class that is a subclass of wire-object
. If it is a subclass of update
, the keys (and values) named :id
and :clock
must also be present, lest an error be generated.
Null characters (U+0000
) must not appear anywhere within a wireable. If a string were to contain null characters, they must be filtered out. If a symbol were to contain null characters, the message may not be put to the wire.
The server must keep track of a number of objects that are related to the current state of the chat system. The client may also keep track of some of these objects for its own convenience.
Each client is connected to the server through a connection
object. Each connection in turn is tied to a user object. A user may have up to an implementation-dependant number of connections at the same time.
user
s represent participants on the chat network. A user has a globally unique name and a number of connections that can act as the user. Each user can be active in a number of channels, the maximal number of which is implementation-dependant. A user must always inhabit the primary channel. A user may have a profile object associated with it. When such a profile exists, the user is considered to be "registered." The server itself must also have an associated user object, the name of which is up to the specific server instance.
A user's name must be between 1 and 32 characters long, where each character must be from the Unicode general categories Letter, Mark, Number, Punctuation, and Symbol, or be a Space (U+0020
). The name must not begin or end with
with Spaces (U+0020
). Two user names are considered the same if they are the same length and each code point matches case-insensitively.
The profile
primarily exists to allow end-users to log in to a user through a password and thus secure the username from being taken by others. A profile has a maximal lifetime. If the user associated with the profile has not been used for longer than the profile's lifetime, the profile is deleted.
A profile's password must be at least 6 characters long. It may contain any kind of character that is not Null (U+0000
).
channel
s represent communication channels for users over which they can send messages to each other. A channel has a set of permission rules that constrain what kind of updates may be performed on the channel by whom. There are three types of channels that only differ in their naming scheme and their permissions.
Exactly one of these must exist on any server, and it must be named the same as the server's user. All users that are currently connected to the server must inhabit this channel. The channel may not be used for sending messages by anyone except for system administrators or the server itself. The primary channel is also used for updates that are "channel-less," to check them for permissions.
Anonymous channels must have a random name that is prefixed with an @
. Their permissions must prevent users that are not already part of the channel from sending join
, channels
, users
, or any other kind of update to it, thus essentially making it invisible safe for specially invited users.
Any other channel is considered a "regular channel".
The names of channels are constrained in the same way as user names. See §2.2.1.
A permission rule specifies the restrictions of an update type on who is allowed to perform the update on the channel. The structure is as follows:
RULE ::= (type EXPR)
EXPR ::= t | nil | EXCLUDE | INCLUDE
EXCLUDE ::= (- username*)
INCLUDE ::= (+ username*)
Where type
is the name of an update class, and username
is the name of a user object. t
is the CL symbol T
and indicates "anyone". nil
is the CL symbol NIL
and indicates "no one". The INCLUDE
expression only allows users whose names are listed to perform the action. The EXCLUDE
expression allows anyone except users whose names are listed to perform the action. The expression t
is thus equivalent to (-)
and the expression nil
is equivalent to (+)
.
The client and the server communicate through update
objects over a connection. Each such object that is issued from the client must contain a unique id
. This is important as the ID is reused by the server in order to communicate replies. The client can then compare the ID of the incoming updates to find the response to an earlier request, as responses may be reordered or delayed. The server does not check the ID in any way-- uniqueness and avoidance of clashing is the responsibility of the client. Each update must also contain a clock
slot that specifies the time of sending. This is used to calculate latency and potential connection problems.
When an update is sent to a channel, it is distributed to all the users currently in the channel. When an update is sent to a user, it is distributed to all the connections of the user. When an update is sent to a connection, it is serialised to the wire according to the above wire format specification. The actual underlying mechanism that transfers the characters of the wire format to the remote host is implementation-dependant.
Following each update that is put on the wire has to be a single null character (U+0000
). This character can be used to distinguish individual updates on the wire and may serve as a marker to attempt and stabilise the stream in case of malformed updates or other problems that might occur on the lower level.
After the connection between a client and a server has been established through some implementation-dependant means, the client must send a connect
update. The update will attempt to register the user on the server, as follows:
too-many-connections
update is returned and the connection is closed.version
denotes a version that is not compatible to the version of the protocol on the server, an incompatible-version
update is returned and the connection is closed.from
field contains an invalid name, a bad-name
update is returned and the connection is closed.password
, and the from
field denotes a username that is already taken by an active user or a registered user, an username-taken
update is returned and the connection is closed.password
, and the from
field denotes a username that is not registered, a no-such-profile
update is returned and the connection is closed.password
, and the from
field denotes a username that is registered, but whose password does not match the given one, an invalid-password
update is returned and the connection is closed.too-many-connections
update is returned and the connection is closed.from
field is created if it does not yet exist.connect
update of the same id as the one the client sent. The from
field must correspond to the server's user object's name.join
updates for each of the channels the user is currently inhabiting.If the clock
of an update diverges too much from the one known by the server, the server may drop the connection after replying with a connection-unstable
update.
The server must receive an update on a connection within at least a certain implementation-dependant interval that must be larger than 100 seconds. If this does not happen, the server may assume a disconnection and drop the client after replying with a connection-unstable
update. If the server does not receive an update from the client within an interval of up to 60 seconds, the server must send a ping
update to the client, to which the client must respond with a pong
update. This is to ensure the stability of the connection.
If the client sends too many updates in too short a time interval, the server may start dropping updates, as long as it responds with a too-many-updates
update when it starts doing so. This throttling may be sustained for an implementation-dependant length of time. The client might send occasional ping
requests to figure out if the throttling has been lifted. The server may also close the connection if it deems the flooding too severe.
A connection may be closed either due to a disconnect
update request from the client, or due to problems on the server side. When the connection is closed, the server must act as follows:
disconnect
update, if it still can.The exceptional situation being during connection establishment. If the server decides to close the connection then, it may do so without responding with a disconnect
update and may immediately close the underlying connection.
An update is always checked as follows:
malformed-update
update is sent back and the request is dropped.update-too-long
update is sent back and the request is dropped.wire-object
, an invalid-update
update is sent back and the request is dropped.from
, channel
, or target
fields contain an invalid name, a bad-name
update is sent back and the request is dropped.from
field does not match the name known to the server by the user associated to the connection, a username-mismatch
update is sent back and the request is dropped.channel
field denotes a channel that does not exist, but must, a no-such-channel
update is sent back and the request is dropped.target
field denotes a user that does not exist, a no-such-user
update is sent back and the request is dropped.insufficient-permissions
update is sent back and the request is dropped.When a user sends a register
update, the server must act as follows:
registration-rejected
update is sent back and the request is dropped.Note that the server does not need to store the password verbatim, and is instead advised to only store and compare a hash of it.
Since a channel has only two bits of information associated with it, the management of channels is rather simple. Creating a new channel happens with the create
update:
channel
name in the update already exists, the server responds with a channelname-taken
update and drops the request.channel
field is NIL
, an anonymous channel is created, otherwise a regular channel is created.join
update to the user with the id
being the same as the id of the create update.From there on out the channel's permissions can be viewed or changed with the permissions
update, if the channel allows you to do so. Note that the server must only update the channel's permissions, if the update's permissions
field is not NIL
.
See §2.5 for an explanation of the proper syntax of the permissions.
A user can interact with a channel in several ways.
Joining a channel happens with the join
update, after which the server acts as follows:
already-in-channel
update is sent back and the request is dropped.join
update is distributed to all users in the channel.Leaving a channel again happens with the leave
update, after which the server acts as follows:
not-in-channel
update is sent back and the request is dropped.leave
update is distributed to all users in the channel.Another user can be pulled into the channel by the pull
update, after which the server acts as follows:
not-in-channel
update is sent back and the request is dropped.already-in-channel
update is sent back and the request is dropped.join
update for the target user with the same id
as the pull
update is distributed to all users in the channel.Another user can be kicked from a channel by the kick
update, after which the server acts as follows:
not-in-channel
update is sent back and the request is dropped.not-in-channel
update is sent back and the request is dropped.kick
update is distributed to all users in the channel.leave
update for the target user is distributed to all users in the channel.Finally, a user can send a message to all other users in a channel with the message
update, after which the server acts as follows:
not-in-channel
update is sent back and the request is dropped.message
update is distributed to all users in the channel.The server can provide a client with several pieces of information about its current state.
Retrieving a list of channels can be done with the channels
update, after which the server acts as follows:
channels
update with the same id
as the request is sent back with the channels
field set to the list of names of channels that were recorded.The list of users currently in a channel can be retrieved by the users
update, after which the server acts as follows:
users
update with the same id
as the request is sent back with the users
field set to the list of names of users that were recorded.Finally, information about a particular user can be retrieved by the user-info
update, after which the server acts as follows:
user-info
update with the same id
as the request is sent back with the connections
field set to the number of connections the user object has associated with it and with the registered
field set to T
if the user has a profile associated with it.A server or client may provide extensions to the protocol in the following manners:
invalid-update
.Each extension to the protocol should receive a unique name of the form producer-name
where producer
is an identifier for who wrote up the extension's protocol, and name
should be a name for the extension itself. For each extension that a server and client support, they must include the unique name of it as a string in the connect
update's extensions
list.
The extensions outlined in this section are not mandatory and a server or client may choose not to implement them.
A new update type called backfill
is introduced, which is a channel-update
. If the server receives such an update from a connection, it reacts as follows:
not-in-channel
update is sent back and the request is dropped.The purpose of this extension is to allow users to catch up with the contents of a channel should they initiate a new connection which does not currently have access to all the past updates of the channel. In order to facilitate this, the server is forced to keep copies of the updates. The server is allowed to only keep updates for a certain duration, or only a certain number of total updates. In order to avoid spying, the server must not distribute updates that the user did not already receive previously through another connection. The server does not have to make any guarantee about the order in which the updates are sent back to the connection. The client on the other side is responsible for ordering them as appropriate according to the clock.
A new update type called data
is introduced, which is a channel-update
. Additionally, a new failure
type called bad-content-type
is introduced, which is an update-failure
. If the server receives a data
update from a connection, it reacts as follows:
not-in-channel
update is sent back and the request is dropped.content-type
is not accepted by the server, a bad-content-type
update is sent back and the request is dropped.data
update is distributed to all users in the channel.The data
update contains three slots, with the following intentions:
content-type
A string representing the content type of the payload data contained in the update.filename
A string representing an arbitrary name given to the payload data.payload
A base-64 encoded string of binary data payload.The purpose of this extension is to allow users to send binary data over channels. Particularly, the intention is to allow embedding of images, audio, video, and other media.
Two new update types called emotes
and emote
are introduced. If the server receives an emotes
update from a connection, it reacts as follows:
names
slot. Emote names are case-insensitive.emote
update, where the name
is set to the emote's name, and the payload
is set to the base-64 encoded image representing the emote. The content-type
must be set accordingly.When the client receives an emote
update from the server, it reacts as follows:
payload
and content-type
are associated with the name
and persisted on the client. When the client sends an emotes
event it to the server it should include the name of this emote in the names
list.The emotes
update contains one slot, with the following intentions:
names
This contains a list of strings denoting the names of emotes the client knows about.The emote
update contains three slots, with the following intentions:
content-type
A string representing the content type of the emote image contained in the update.name
A string representing the name of the emote.payload
A base-64 encoded string of binary data payload.When the client sees a message
update, every match of the regex :([^:]+):
in the text
where the group matched by the regex is the name of an emote from the known list of emotes, then the match of the regex should be displayed to the user by an image of the emote's image.
The purpose of this extension is to allow the server manager to configure emote images for the users to use, similar in functionality to what is often found on forums and other platforms.
A new update type called edit
is introduced, which is a message
. If the server receives an edit
update it acts in the same way as a regular message
event. No additional support from the server is required outside of recognising and accepting the type.
When the client sees an edit
update, it should change the text
of the message
update with the same from
and id
fields to the one from the edit
update. Ideally a user interface for Lichat should also include an indication that the previous message event has been changed, including perhaps even a history of all the potential edits of a message.
If the client receives an edit
update whose id
and from
fields do not refer to any previous message
update, the client should simply ignore the update.
A new convention for channel names is introduced. §2.4.4 is restricted further in the following manner: forward slash characters (U+002F
) may only occur between two other characters that are not a forward slash character.
Generally for a channel-update
, the following terminology is introduced: the parent channel
is a channel with the name of the current channel up to and excluding the last forward slash character in the name. If no forward slash occurs in the name, the primary channel is considered the parent channel.
A new error no-such-parent-channel
is introduced. It is an update-failure
.
§5.3 is modified as follows: instead of point 1
: The update is checked for permissions by the parent channel. After point 2
: If the parent channel does not exist, the server responds with a no-such-parent-channel
update and drops the request.
§5.5.1 is modified as follows: the channels
update is upgraded to a channel-update
and as such contains a channel
field. When processing the channels
update, the server should only process channels whose names begin with the name mentioned in the channel
field followed by a forward slash and do not contain any further forward slashes.
Specifically, an update requesting foo
should list foo/bar
, but not foo/bar/baz
.
Clients that support this extension are required to implement the following special semantic: if a user uses a command that requires a channel name, and the user begins the channel name with a forward slash, the client should automatically prepend the current channel name to the specified channel name, if there is a channel that is considered "current". If no channel is explicitly current, the primary channel is considered current.
Next: Files, Previous: Introduction, Up: Top [Contents][Index]
The main system appears first, followed by any subsystem dependency.
• The lichat-protocol system |
Nicolas Hafner <shinmera@tymoon.eu>
Nicolas Hafner <shinmera@tymoon.eu>
(:git "https://github.com/shirakumo/lichat-protocol.git")
zlib
The independent protocol part of Lichat.
1.5
lichat-protocol.asd (file)
Files are sorted by type and then listed depth-first from the systems components trees.
• Lisp files |
Next: The lichat-protocol/package․lisp file, Previous: Lisp files, Up: Lisp files [Contents][Index]
lichat-protocol.asd
lichat-protocol (system)
Next: The lichat-protocol/conditions․lisp file, Previous: The lichat-protocol․asd file, Up: Lisp files [Contents][Index]
lichat-protocol (system)
package.lisp
Next: The lichat-protocol/printer․lisp file, Previous: The lichat-protocol/package․lisp file, Up: Lisp files [Contents][Index]
package.lisp (file)
lichat-protocol (system)
conditions.lisp
Next: The lichat-protocol/reader․lisp file, Previous: The lichat-protocol/conditions․lisp file, Up: Lisp files [Contents][Index]
conditions.lisp (file)
lichat-protocol (system)
printer.lisp
print-sexpr (function)
Next: The lichat-protocol/typed-slot-class․lisp file, Previous: The lichat-protocol/printer․lisp file, Up: Lisp files [Contents][Index]
printer.lisp (file)
lichat-protocol (system)
reader.lisp
Next: The lichat-protocol/protocol․lisp file, Previous: The lichat-protocol/reader․lisp file, Up: Lisp files [Contents][Index]
reader.lisp (file)
lichat-protocol (system)
typed-slot-class.lisp
Next: The lichat-protocol/wire․lisp file, Previous: The lichat-protocol/typed-slot-class․lisp file, Up: Lisp files [Contents][Index]
typed-slot-class.lisp (file)
lichat-protocol (system)
protocol.lisp
Next: The lichat-protocol/documentation․lisp file, Previous: The lichat-protocol/protocol․lisp file, Up: Lisp files [Contents][Index]
protocol.lisp (file)
lichat-protocol (system)
wire.lisp
Previous: The lichat-protocol/wire․lisp file, Up: Lisp files [Contents][Index]
wire.lisp (file)
lichat-protocol (system)
documentation.lisp
Next: Definitions, Previous: Files, Up: Top [Contents][Index]
Packages are listed by definition order.
• The lichat-protocol package |
package.lisp (file)
org.shirakumo.lichat.protocol
common-lisp
Definitions are sorted by export status, category, package, and then by lexicographic order.
• Exported definitions | ||
• Internal definitions |
Next: Internal definitions, Previous: Definitions, Up: Definitions [Contents][Index]
• Exported special variables | ||
• Exported macros | ||
• Exported functions | ||
• Exported generic functions | ||
• Exported conditions | ||
• Exported classes | ||
• Exported types |
Next: Exported macros, Previous: Exported definitions, Up: Exported definitions [Contents][Index]
Default permissions for anonymous channels.
protocol.lisp (file)
The default lifetime for a new channel in seconds.
Should equal to one standard month (30 days).
protocol.lisp (file)
Default permissions for primary/server channels.
protocol.lisp (file)
The default lifetime for a registered profile in seconds.
Should equal to one non-leap year.
protocol.lisp (file)
Default permissions for non-primary, non-anonymous channels.
protocol.lisp (file)
Counter variables for update IDs.
Starts at a random integer between 0 and the current universal-time.
This is done to make the clashing of IDs less likely to occur between
users of the protocol library.
See NEXT-ID
protocol.lisp (file)
Next: Exported functions, Previous: Exported special variables, Up: Exported definitions [Contents][Index]
Defines a new protocol class.
See DEFINE-TYPED-CLASS
protocol.lisp (file)
Next: Exported generic functions, Previous: Exported macros, Up: Exported definitions [Contents][Index]
Returns true if the given name is a valid name for channels.
See USERNAME-P
protocol.lisp (file)
Checks the given sexpr for conformity to use as initargs for an update.
The items after the first symbol in the list are checked
as follows: they must be balanced pairs of KEYWORD to
atom. If this is not the case, an error of type
MALFORMED-WIRE-OBJECT is signalled. If no key :ID is
found, an error of type MISSING-ID is signalled. If no
key :CLOCK is found, an error of type MISSING-CLOCK is
signalled.
See FROM-WIRE
See MISSING-ID
See MISSING-CLOCK
See MALFORMED-WIRE-OBJECT
wire.lisp (file)
Read a wire object from the stream.
First an object is read from stream by READ-SEXPR.
If the returned object is not a cons, it is returned
immediately. Otherwise, the procedure is as follows:
The first element must be a symbol. If it isn’t, an
error of type MALFORMED-WIRE-OBJECT is signalled.
If the symbol does not designate a class, or designates
a class that is not a subclass of WIRE-OBJECT, an error
of type UNKNOWN-WIRE-OBJECT is signalled. If the class
is a subclass of UPDATE, the rest of the items in the
list are checked by CHECK-UPDATE-OPTIONS. Finally
MAKE-INSTANCE is called with the full expression as
arguments. If the class is a subclass of wire-object,
MAKE-INSTANCE is called with the full expression as
arguments immediately.
See READ-SEXPR
See MALFORMED-WIRE-OBJECT
See UNKNOWN-WIRE-OBJECT
See CHECK-UPDATE-OPTIONS
wire.lisp (file)
Returns true if the given object is a valid ID.
protocol.lisp (file)
Returns a fresh ID.
See *ID-COUNTER*
protocol.lisp (file)
Returns true if the given object is a string of at least six characters.
protocol.lisp (file)
Print an s-expression to the stream.
Only the following types are allowed:
LIST STRING REAL SYMBOL
Any other type will signal an error of type UNPRINTABLE-OBJECT.
See PRINT-SEXPR-LIST
See PRINT-SEXPR-STRING
See PRINT-SEXPR-NUMBER
See PRINT-SEXPR-SYMBOL
See UNPRINTABLE-OBJECT
printer.lisp (file)
Returns the version string for the protocol.
protocol.lisp (file)
Reads an s-expression from the stream.
Skips all the whitespace at the beginning.
Depending on the character following, the reading is
dispatched as follows:
( => READ-SEXPR-LIST
) => Signals an INCOMPLETE-TOKEN error
" => READ-SEXPR-STIRNG
012345689. => READ-SEXPR-NUMBER
: => READ-SEXPR-KEYWORD
otherwise => READ-SEXPR-SYMBOL
See READ-SEXPR-LIST
See READ-SEXPR-STRING
See READ-SEXPR-NUMBER
See READ-SEXPR-KEYWORD
See READ-SEXPR-SYMBOL
reader.lisp (file)
Print the wireable object to the stream.
Only handles objects of type WIRE-OBJECT and WIREABLE.
WIRE-OBJECTS are printed as a list in the following
format: a list of the object’s type symbol followed by
pairs of keyword to value of the object’s slots that
have an initarg. Slots without an initarg are not
printed.
The output is forced once written fully.
See PRINT-SEXPR
See FORCE-OUTPUT
wire.lisp (file)
Returns true if the given name is a valid name for users.
That is to say, the name must be a string in [1,32] of length
and each character must be in the allowed unicode regions. The
name must also not begin or end with a space.
See VALID-NAME-CHAR-P
protocol.lisp (file)
Returns T if the character is considered to be whitespace.
See *WHITESPACE*
reader.lisp (file)
Next: Exported conditions, Previous: Exported functions, Up: Exported definitions [Contents][Index]
Returns a list of allowed content-type identifiers that the server supports.
See BAD-CONTENT-TYPE
(setf allowed-content-types) (generic function)
automatically generated reader method
protocol.lisp (file)
allowed-content-types (generic function)
automatically generated writer method
protocol.lisp (file)
Accessor to the name of the channel the update relates to.
See CHANNEL-UPDATE
(setf channel) (generic function)
automatically generated reader method
protocol.lisp (file)
automatically generated reader method
protocol.lisp (file)
channel (generic function)
automatically generated writer method
protocol.lisp (file)
automatically generated writer method
protocol.lisp (file)
Accessor to the list of channels of the object.
See USER
See CHANNELS
(setf channels) (generic function)
automatically generated reader method
protocol.lisp (file)
automatically generated reader method
protocol.lisp (file)
channels (generic function)
automatically generated writer method
protocol.lisp (file)
automatically generated writer method
protocol.lisp (file)
Accessor to the clock of the update.
Must be a universal-time timestamp set at the time the update
was constructed.
See UPDATE
(setf clock) (generic function)
automatically generated reader method
protocol.lisp (file)
clock (generic function)
automatically generated writer method
protocol.lisp (file)
Accessor to the list of connections of the user or count of connections of the user-info.
See USER
See USER-INFO
(setf connections) (generic function)
automatically generated reader method
protocol.lisp (file)
automatically generated reader method
protocol.lisp (file)
connections (generic function)
automatically generated writer method
protocol.lisp (file)
automatically generated writer method
protocol.lisp (file)
Returns the content-type of the encoded data payload.
See DATA
(setf content-type) (generic function)
automatically generated reader method
protocol.lisp (file)
automatically generated reader method
protocol.lisp (file)
content-type (generic function)
automatically generated writer method
protocol.lisp (file)
automatically generated writer method
protocol.lisp (file)
automatically generated reader method
protocol.lisp (file)
automatically generated writer method
protocol.lisp (file)
Returns the file name of the file sent by the data payload.
See DATA
(setf filename) (generic function)
automatically generated reader method
protocol.lisp (file)
filename (generic function)
automatically generated writer method
protocol.lisp (file)
Accessor to the sender of the update.
Must be a username string identifying the user that sent it.
See UPDATE
(setf from) (generic function)
automatically generated reader method
protocol.lisp (file)
from (generic function)
automatically generated writer method
protocol.lisp (file)
Accessor to the ID of the update.
IDs should be connection-unique, meaning the same ID should not
appear on different connections at the same time.
See UPDATE
(setf id) (generic function)
automatically generated reader method
protocol.lisp (file)
id (generic function)
automatically generated writer method
protocol.lisp (file)
Accessor to the lifetime of the object.
The object should stay alive for at least this many
seconds after it has ceased to be used.
See PROFILE
See CHANNEL
(setf lifetime) (generic function)
automatically generated reader method
protocol.lisp (file)
automatically generated reader method
protocol.lisp (file)
lifetime (generic function)
automatically generated writer method
protocol.lisp (file)
automatically generated writer method
protocol.lisp (file)
Accessor to the object’s name string.
See NAMED-OBJECT
(setf name) (generic function)
automatically generated reader method
protocol.lisp (file)
automatically generated reader method
protocol.lisp (file)
name (generic function)
automatically generated writer method
protocol.lisp (file)
automatically generated writer method
protocol.lisp (file)
automatically generated reader method
protocol.lisp (file)
automatically generated writer method
protocol.lisp (file)
The object related to the condition.
See UNPRINTABLE-OBJECT
See INCOMPATIBLE-VALUE-TYPE-FOR-SLOT
conditions.lisp (file)
conditions.lisp (file)
Accessor to the password of the object.
See PROFILE
See REGISTER
See CONNECT
(setf password) (generic function)
automatically generated reader method
protocol.lisp (file)
automatically generated reader method
protocol.lisp (file)
password (generic function)
automatically generated writer method
protocol.lisp (file)
automatically generated writer method
protocol.lisp (file)
Returns a base64 encoded data payload.
See DATA
See EMOTE
(setf payload) (generic function)
automatically generated reader method
protocol.lisp (file)
automatically generated reader method
protocol.lisp (file)
payload (generic function)
automatically generated writer method
protocol.lisp (file)
automatically generated writer method
protocol.lisp (file)
Accessor to the permissions list of the object.
See CHANNEL
See PERMISSIONS
(setf permissions) (generic function)
automatically generated reader method
protocol.lisp (file)
automatically generated reader method
protocol.lisp (file)
permissions (generic function)
automatically generated writer method
protocol.lisp (file)
automatically generated writer method
protocol.lisp (file)
Accessor to whether the user is registered or not.
See USER-INFO
(setf registered) (generic function)
automatically generated reader method
protocol.lisp (file)
registered (generic function)
automatically generated writer method
protocol.lisp (file)
A symbol designator.
Returns a CONS of two strings for the package- and symbol-name respectively.
See NULL-IN-SYMBOL-DESIGNATOR
See UNKNOWN-SYMBOL
conditions.lisp (file)
conditions.lisp (file)
Accessor to the name of the user being targeted.
See TARGET-UPDATE
(setf target) (generic function)
automatically generated reader method
protocol.lisp (file)
target (generic function)
automatically generated writer method
protocol.lisp (file)
Accessor to the text string carried by the update.
See TEXT-UPDATE
(setf text) (generic function)
automatically generated reader method
protocol.lisp (file)
text (generic function)
automatically generated writer method
protocol.lisp (file)
The update object that relates to the condition.
See MISSING-UPDATE-ARGUMENT
See UNKNOWN-WIRE-OBJECT
conditions.lisp (file)
conditions.lisp (file)
conditions.lisp (file)
Accessor to the ID of the update that failed to be completed.
See UPDATE-FAILURE
(setf update-id) (generic function)
automatically generated reader method
protocol.lisp (file)
update-id (generic function)
automatically generated writer method
protocol.lisp (file)
Accessor to the user tied to the connection.
See CONNECTION
See USER
(setf user) (generic function)
automatically generated reader method
protocol.lisp (file)
user (generic function)
automatically generated writer method
protocol.lisp (file)
Accessor to the list of users of the object.
See CHANNEL
See USERS
(setf users) (generic function)
automatically generated reader method
protocol.lisp (file)
automatically generated reader method
protocol.lisp (file)
users (generic function)
automatically generated writer method
protocol.lisp (file)
automatically generated writer method
protocol.lisp (file)
Accessor to the version of the connection update.
See CONNECT
(setf version) (generic function)
automatically generated reader method
protocol.lisp (file)
version (generic function)
automatically generated writer method
protocol.lisp (file)
Next: Exported classes, Previous: Exported generic functions, Up: Exported definitions [Contents][Index]
Condition signalled when an incompatible type is attempted to be set on a slot.
See OBJECT
See SLOT
See VALUE
See REQTYPE
conditions.lisp (file)
:object
object (generic function)
:slot
slot (generic function)
:value
value (generic function)
:type
reqtype (generic function)
Condition signalled when a token is not complete on the wire and thus can’t be read fully.
conditions.lisp (file)
Condition signalled when an object is found on the wire but is malformed and can’t be parsed.
See UPDATE
conditions.lisp (file)
update (method)
:update
update (generic function)
Condition signalled when the CLOCK field is missing from an update.
conditions.lisp (file)
Condition signalled when the ID field is missing from an update.
conditions.lisp (file)
Superclass for all conditions relating to missing required arguments in updates.
See MISSING-ID
See MISSING-CLOCK
See UPDATE
conditions.lisp (file)
wire-condition (condition)
update (method)
:update
update (generic function)
Condition signalled when a symbol is attempted to be put to the wire whose designator contains NULL characters.
See SYMBOL-DESIGNATOR
conditions.lisp (file)
symbol-designator (method)
:symbol-designator
symbol-designator (generic function)
Superclass for all conditions relating to printing to the wire.
See UNPRINTABLE-OBJECT
conditions.lisp (file)
wire-condition (condition)
Superclass for all conditions relating to the protocol.
See WIRE-CONDITION
See INCOMPATIBLE-VALUE-TYPE-FOR-SLOT
conditions.lisp (file)
condition (condition)
conditions.lisp (file)
Superclass for all conditions relating to reading from the wire.
See INCOMPLETE-TOKEN
See UNKNOWN-SYMBOL
conditions.lisp (file)
wire-condition (condition)
Condition signalled when a null character was found in the middle of an update.
See READER-CONDITION
conditions.lisp (file)
Condition signalled when an unknown symbol is found on the wire.
See SYMBOL-DESIGNATOR
conditions.lisp (file)
symbol-designator (method)
:symbol-designator
symbol-designator (generic function)
Condition signalled when an object is found on the wire that has an unknown type.
See UPDATE
conditions.lisp (file)
update (method)
:update
update (generic function)
Condition signalled when an unprintable object is attempted to be put onto the wire.
See OBJECT
conditions.lisp (file)
object (method)
:object
object (generic function)
Superclass for all conditions relating to the wire format.
See PRINTER-CONDITION
See READER-CONDITION
See MISSING-UPDATE-ARGUMENT
See UNKNOWN-WIRE-OBJECT
See MALFORMED-WIRE-OBJECT
conditions.lisp (file)
protocol-condition (condition)
Next: Exported types, Previous: Exported conditions, Up: Exported definitions [Contents][Index]
Update in response to a JOIN/PULL request for a user that is already in the specified channel.
See UPDATE-FAILURE
protocol.lisp (file)
Initarg | Value |
---|---|
:text | "the user is already in the channel." |
Update to represent a backfill request.
Possible responses:
See NOT-IN-CHANNEL
See CHANNEL-UPDATE
protocol.lisp (file)
Update in response to a DATA update with a content-type the server does not support.
See UPDATE-FAILURE
See ALLOWED-CONTENT-TYPES
protocol.lisp (file)
:allowed-content-types
allowed-content-types (generic function)
(setf allowed-content-types) (generic function)
Initarg | Value |
---|---|
:text | "the supplied content type for the data update is not accepted by this server." |
:allowed-content-types | nil |
Update in response to any named request with a name that is not valid.
Relevant are the FROM, TARGET, and CHANNEL fields.
See UPDATE-FAILURE
protocol.lisp (file)
Initarg | Value |
---|---|
:text | "the specified name is not a valid name." |
Class to represent a channel.
See NAMED-OBJECT
See SERVER-OBJECT
See PERMISSIONS
See LIFETIME
See USERS
See *DEFAULT-CHANNEL-LIFETIME*
protocol.lisp (file)
:permissions
permissions (generic function)
(setf permissions) (generic function)
:lifetime
lifetime (generic function)
(setf lifetime) (generic function)
:users
users (generic function)
(setf users) (generic function)
Initarg | Value |
---|---|
:permissions | nil |
:lifetime | lichat-protocol:*default-channel-lifetime* |
:users | nil |
Superclass for all updates relating to a channel.
See CHANNEL
See UPDATE
protocol.lisp (file)
:channel
channel (generic function)
(setf channel) (generic function)
Update in response to a CREATE request for a channel that already exists.
See UPDATE-FAILURE
protocol.lisp (file)
Initarg | Value |
---|---|
:text | "the requested channelname is already taken." |
Update to represent a channels listing request.
Possible responses:
See CHANNELS
See BAD-NAME
See USERNAME-MISMATCH
See CHANNELS
See UPDATE
protocol.lisp (file)
:channels
channels (generic function)
(setf channels) (generic function)
Initarg | Value |
---|---|
:channels | nil |
Update to represent a connection request.
This update must be the first thing sent by the client upon
connection establishment.
Possible responses:
See CONNECT
See BAD-NAME
See INVALID-PASSWORD
See USERNAME-TAKEN
See NO-SUCH-PROFILE
See INCOMPATIBLE-VERSION
See PASSWORD
See VERSION
See UPDATE
protocol.lisp (file)
:password
password (generic function)
(setf password) (generic function)
:version
version (generic function)
(setf version) (generic function)
:extensions
extensions (generic function)
(setf extensions) (generic function)
Initarg | Value |
---|---|
:password | nil |
:version | (lichat-protocol:protocol-version) |
:extensions | nil |
Class to represent a connection of a user.
See SERVER-OBJECT
See USER
protocol.lisp (file)
:user
user (generic function)
(setf user) (generic function)
Initarg | Value |
---|---|
:user | nil |
Update in response to an unstable or slow connection.
See FAILURE
protocol.lisp (file)
Initarg | Value |
---|---|
:text | "the connection is unstable. you may be disconnected soon." |
Update to represent a channel creation request.
The channel may be NIL, in which case an anonymous channel
is constructed. You can obtain the name of the anonymous
channel by reading it out of the JOIN response.
Possible responses:
See JOIN
See BAD-NAME
See USERNAME-MISMATCH
See CHANNELNAME-TAKEN
See BAD-NAME
See INSUFFICIENT-PERMISSIONS
See CHANNEL-UPDATE
protocol.lisp (file)
:channel
channel (generic function)
(setf channel) (generic function)
Initarg | Value |
---|---|
:channel | nil |
Update to represent a raw data message.
Possible responses:
See NOT-IN-CHANNEL
See BAD-CONTENT-TYPE
See DATA
See CONTENT-TYPE
See FILENAME
See PAYLOAD
See CHANNEL-UPDATE
protocol.lisp (file)
:content-type
content-type (generic function)
(setf content-type) (generic function)
:filename
filename (generic function)
(setf filename) (generic function)
:payload
payload (generic function)
(setf payload) (generic function)
Initarg | Value |
---|---|
:file-name | nil |
Update to represent a disconnection request.
Possible responses:
See DISCONNECT
See USERNAME-MISMATCH
See UPDATE
protocol.lisp (file)
Update to represent a change to an existing message.
See MESSAGE
protocol.lisp (file)
Update to represent an emote entity.
This should only be sent by the server.
See CONTENT-TYPE
See NAME
See PAYLOAD
See UPDATE
protocol.lisp (file)
:content-type
content-type (generic function)
(setf content-type) (generic function)
:name
name (generic function)
(setf name) (generic function)
:payload
payload (generic function)
(setf payload) (generic function)
Update to represent an emote listing request.
Possible responses:
See EMOTE
See UPDATE
See NAMES
protocol.lisp (file)
:names
names (generic function)
(setf names) (generic function)
Initarg | Value |
---|---|
:names | nil |
Superclass for all failure response updates.
See TEXT-UDPATE
protocol.lisp (file)
Update in response to a connection attempt with an incompatible protocol version.
See COMPATIBLE-VERSIONS
See UPDATE-FAILURE
protocol.lisp (file)
:compatible-versions
compatible-versions (generic function)
(setf compatible-versions) (generic function)
Initarg | Value |
---|---|
:text | "the server and client versions are not compatible." |
Update in response to a request that is not permitted on the current or primary channel.
See UPDATE-FAILURE
protocol.lisp (file)
Initarg | Value |
---|---|
:text | "you do not have sufficient permissions to perform the requested action." |
Update in response to a connection attempt with an invalid password for the profile.
See UPDATE-FAILURE
protocol.lisp (file)
Initarg | Value |
---|---|
:text | "invalid username or password." |
Update in response to a PERMISSIONS request that attempted to set malformed permissions.
See UPDATE-FAILURE
protocol.lisp (file)
Initarg | Value |
---|---|
:text | "the permissions are malformed." |
Update in response to an update of invalid type.
See UPDATE-FAILURE
protocol.lisp (file)
Initarg | Value |
---|---|
:text | "the update class is invalid." |
Update to represent a channel join request.
Possible responses:
See JOIN
See BAD-NAME
See USERNAME-MISMATCH
See ALREADY-IN-CHANNEL
See NO-SUCH-CHANNEL
See INSUFFICIENT-PERMISSIONS
See CHANNEL-UDPATE
protocol.lisp (file)
Update to represent a user kick request.
Possible responses:
See KICK
See BAD-NAME
See USERNAME-MISMATCH
See NOT-IN-CHANNEL
See NO-SUCH-USER
See NO-SUCH-CHANNEL
See INSUFFICIENT-PERMISSIONS
See TARGET-UPDATE
See CHANNEL-UPDATE
protocol.lisp (file)
Update to represent a channel leave request.
Possible responses:
See LEAVE
See BAD-NAME
See USERNAME-MISMATCH
See NOT-IN-CHANNEL
See NO-SUCH-CHANNEL
See INSUFFICIENT-PERMISSIONS
See CHANNEL-UDPATE
protocol.lisp (file)
Update in response to a malformed update.
See FAILURE
protocol.lisp (file)
Initarg | Value |
---|---|
:text | "update was malformed and could not be parsed." |
Update to represent a channel message request.
Possible responses:
See MESSAGE
See BAD-NAME
See USERNAME-MISMATCH
See NO-SUCH-CHANNEL
See INSUFFICIENT-PERMISSIONS
See CHANNEL-UPDATE
See TEXT-UPDATE
protocol.lisp (file)
edit (class)
Superclass for all objects that are named.
See NAME
protocol.lisp (file)
typed-object (class)
:name
name (generic function)
(setf name) (generic function)
Update in response to a CHANNEL-UPDATE for a channel that does not exist.
See UPDATE-FAILURE
protocol.lisp (file)
Initarg | Value |
---|---|
:text | "no such channel exists on the server." |
Update in response to a connection attempt with a password for an inexistent profile.
See UPDATE-FAILURE
protocol.lisp (file)
Initarg | Value |
---|---|
:text | "no such profile could be found." |
Update in response to a TARGET-UPDATE request that refers to user that does not exist.
See UPDATE-FAILURE
protocol.lisp (file)
Initarg | Value |
---|---|
:text | "the requested user does not exist." |
Update in response to a LEAVE/KICK request for a user that is not in the specified channel.
See UPDATE-FAILURE
protocol.lisp (file)
Initarg | Value |
---|---|
:text | "the user is not part of the channel." |
Update to represent a channel permissions view or change request.
If PERMISSIONS is NIL, the permissions are not changed.
Possible responses:
See PERMISSIONS
See BAD-NAME
See USERNAME-MISMATCH
See NO-SUCH-CHANNEL
See INSUFFICIENT-PERMISSIONS
See PERMISSIONS
See CHANNEL-UPDATE
protocol.lisp (file)
:permissions
permissions (generic function)
(setf permissions) (generic function)
Initarg | Value |
---|---|
:permissions | nil |
Update to represent a ping request.
The recipient must reply with a PONG update.
Possible responses:
PONG
See UPDATE
protocol.lisp (file)
Update to represent a pong response.
See PING
See UPDATE
protocol.lisp (file)
Class to represent user profiles. Only registered users have a profile.
See NAMED-OBJECT
See SERVER-OBJECT
See NAME
See PASSWORD
See LIFETIME
See *DEFAULT-PROFILE-LIFETIME*
protocol.lisp (file)
:lifetime
lifetime (generic function)
(setf lifetime) (generic function)
Initarg | Value |
---|---|
:lifetime | lichat-protocol:*default-profile-lifetime* |
Update to represent a user pull request.
The user will be automatically joined to the channel.
Possible responses:
See JOIN
See BAD-NAME
See USERNAME-MISMATCH
See ALREADY-IN-CHANNEL
See NO-SUCH-USER
See NO-SUCH-CHANNEL
See INSUFFICIENT-PERMISSIONS
See TARGET-UPDATE
See CHANNEL-UPDATE
protocol.lisp (file)
Update to represent a registration request.
Possible responses:
See REGISTRATION-REJECTED
See REGISTER
See BAD-NAME
See USERNAME-MISMATCH
See INSUFFICIENT-PERMISSIONS
See UPDATE
protocol.lisp (file)
:password
password (generic function)
(setf password) (generic function)
Update in response to a REGISTER request that the server rejected.
See UPDATE-FAILURE
protocol.lisp (file)
Initarg | Value |
---|---|
:text | "your profile registration was rejected." |
Superclass for all objects that exist on the server-side.
protocol.lisp (file)
typed-object (class)
Superclass for all updates that target a user.
See TARGET
See UPDATE
protocol.lisp (file)
:target
target (generic function)
(setf target) (generic function)
Superclass for all updates that carry a text string.
See TEXT
See UPDATE
protocol.lisp (file)
:text
text (generic function)
(setf text) (generic function)
Update in response to too many connections being requested on the server globally, or for a single user.
See FAILURE
protocol.lisp (file)
Initarg | Value |
---|---|
:text | "there are too many connections for this user or on this server." |
Update in response to a flooding of the server.
When this update is sent, any number of future updates
that are received may be dropped instead.
See UPDATE-FAILURE
protocol.lisp (file)
Initarg | Value |
---|---|
:text | "you have been sending too many updates and have been throttled." |
Base class for all updates.
See WIRE-OBJECT
See ID
See CLOCK
See FROM
See NEXT-ID
protocol.lisp (file)
:clock
clock (generic function)
(setf clock) (generic function)
:from
from (generic function)
(setf from) (generic function)
Initarg | Value |
---|---|
:id | (lichat-protocol:next-id) |
:clock | (get-universal-time) |
Update in response to an update request that failed.
See UPDATE-ID
See FAILURE
protocol.lisp (file)
:update-id
update-id (generic function)
(setf update-id) (generic function)
Update in response to an update that contained too many characters.
See FAILURE
protocol.lisp (file)
Initarg | Value |
---|---|
:text | "the update was too long and has been dropped." |
Class to represent a user. Anything that can communicate with the server must have a user obuject.
See NAMED-OBJECT
See SERVER-OBJECT
See CONNECTIONS
See CHANNELS
protocol.lisp (file)
:connections
connections (generic function)
(setf connections) (generic function)
:channels
channels (generic function)
(setf channels) (generic function)
Initarg | Value |
---|---|
:connections | nil |
:channels | nil |
Update to represent a user information request.
Possible responses:
See USER-INFO
See BAD-NAME
See USERNAME-MISMATCH
See NO-SUCH-USER
See REGISTERED
See CONNECTIONS
See TARGET-UPDATE
protocol.lisp (file)
:registered
registered (generic function)
(setf registered) (generic function)
:connections
connections (generic function)
(setf connections) (generic function)
Initarg | Value |
---|---|
:registered | nil |
:connections | 1 |
Update in response to a mismatch between the known username and the one in the FROM field.
See UPDATE-FAILURE
protocol.lisp (file)
Initarg | Value |
---|---|
:text | "the from field did not match the known username of the connection." |
Update in response to a connection attempt with a username that is already taken.
See UPDATE-FAILURE
protocol.lisp (file)
Initarg | Value |
---|---|
:text | "the requested username is already taken." |
Update to represent a channel users listing request.
Possible responses:
USERS
BAD-NAME
USERNAME-MISMATCH
NO-SUCH-CHANNEL
INSUFFICIENT-PERMISSIONS
See CHANNEL-UPDATE
See USERS
protocol.lisp (file)
:users
users (generic function)
(setf users) (generic function)
Initarg | Value |
---|---|
:users | nil |
Superclass for all classes that can be put onto the wire.
protocol.lisp (file)
typed-object (class)
update (class)
Previous: Exported classes, Up: Exported definitions [Contents][Index]
Type that is satisfied for all channelname strings.
See CHANNELNAME-P
protocol.lisp (file)
Type that is satisfied for all ID objects.
See ID-P
protocol.lisp (file)
Type that is satisfied for all password strings.
See PASSWORD-P
protocol.lisp (file)
Type that is satisfied for all username strings.
See USERNAME-P
protocol.lisp (file)
Type for all objects that are permitted to appear on the wire.
Should be the union of REAL STRING CONS SYMBOL WIRE-OBJECT
protocol.lisp (file)
Previous: Exported definitions, Up: Definitions [Contents][Index]
• Internal special variables | ||
• Internal macros | ||
• Internal functions | ||
• Internal generic functions | ||
• Internal classes |
Next: Internal macros, Previous: Internal definitions, Up: Internal definitions [Contents][Index]
A list of errors that occurred during reading.
reader.lisp (file)
Placeholder symbol for symbols that could not be properly read.
reader.lisp (file)
reader.lisp (file)
reader.lisp (file)
Placeholder value for unbound values.
typed-slot-class.lisp (file)
A vector of whitespace characters.
reader.lisp (file)
Next: Internal functions, Previous: Internal special variables, Up: Internal definitions [Contents][Index]
Shorthand wrapper around defclass to set it up for a typed-class.
See TYPED-OBJECT
See TYPED-SLOT-CLASS
typed-slot-class.lisp (file)
Next: Internal generic functions, Previous: Internal macros, Up: Internal definitions [Contents][Index]
Checks whether the given value is suitable for the given object’s slot.
If it is not, an error of type INCOMPATIBLE-VALUE-TYPE-FOR-SLOT
is signalled.
typed-slot-class.lisp (file)
reader.lisp (file)
reader.lisp (file)
reader.lisp (file)
Returns the slot’s value if it is bound, or *UNBOUND-VALUE* if it is not.
protocol.lisp (file)
Print an s-expression list to the stream.
This only handles proper lists. List items are printed recursively.
See PRINT-SEXPR
printer.lisp (file)
Print an s-expression number to the stream.
Only integers and floats can be printed, which are printed according to the CLHS rules on printing numbers.
printer.lisp (file)
Print an s-expression string to the stream.
Prints all characters verbatim, with the exception of ", which is escaped with a backslash.
printer.lisp (file)
Print an s-expression symbol to the stream.
Symbols are printed as follows:
KEYWORD:FOO => :FOO
LICHAT-PROTOCOL:FOO => FOO
#:FOO => #:FOO
SOMEWHERE:FOO => SOMEWHERE:FOO
See PRINT-SEXPR-TOKEN
printer.lisp (file)
Print an s-expression token to the stream.
All characters in the token string are printed verbatim, with the exception of
"():0123456789. #
which are escaped by a backslash.
printer.lisp (file)
Read a keyword from the stream. It is assumed that the colon has already been read.
See SAFE-FIND-SYMBOL
See READ-SEXPR-TOKEN
reader.lisp (file)
Read a list from the stream. It is assumed that the opening paren has already been read.
reader.lisp (file)
Reads a number from the stream. The number can be either an integer or a float.
reader.lisp (file)
Read a string from the stream. It is assumed that the opening double-quote has already been read.
reader.lisp (file)
Reads a symbol from the stream.
See READ-SEXPR-TOKEN
See SAFE-FIND-SYMBOL
reader.lisp (file)
Reads a token from the stream.
Tokens are sequences of characters that are terminated
by one of the following:
"():0123456789.
These characters may still appear in a token, but must
be escaped by a backslash.
reader.lisp (file)
Similar to FIND-SYMBOL, but recording an error for unknown symbols.
If the symbol cannot be found, a condition of type
UNKNOWN-SYMBOL is pushed onto the *ERRORS* list and
*INVALID-SYMBOL* is returned.
See FIND-SYMBOL
See UNKNOWN-SYMBOL
See *INVALID-SYMBOL*
See *ERRORS*
reader.lisp (file)
Consumes all characters from the stream until a non-whitespace character is found.
See WHITESPACE-P
reader.lisp (file)
Returns true if the given character is an allowed character in names.
This is according to §2.2.1 and §2.4.4.
protocol.lisp (file)
Next: Internal classes, Previous: Internal functions, Up: Internal definitions [Contents][Index]
Accessor to the list of version strings that this server is compatible with.
See INCOMPATIBLE-VERSION
(setf compatible-versions) (generic function)
automatically generated reader method
protocol.lisp (file)
compatible-versions (generic function)
automatically generated writer method
protocol.lisp (file)
The required type for the slot that was attempted to be set.
See INCOMPATIBLE-VALUE-TYPE-FOR-SLOT
conditions.lisp (file)
The slot that was attempted to be set.
See INCOMPATIBLE-VALUE-TYPE-FOR-SLOT
conditions.lisp (file)
Accessor to the type constraint of the typed-slot.
See TYPED-SLOT
(setf slot-type) (generic function)
automatically generated reader method
typed-slot-class.lisp (file)
slot-type (generic function)
automatically generated writer method
typed-slot-class.lisp (file)
The value that was attempted to be set.
See INCOMPATIBLE-VALUE-TYPE-FOR-SLOT
conditions.lisp (file)
Previous: Internal generic functions, Up: Internal definitions [Contents][Index]
Direct-slot class for typed slots.
See TYPED-SLOT
typed-slot-class.lisp (file)
Effective-slot class for typed slots.
See TYPED-SLOT
typed-slot-class.lisp (file)
Superclass for objects with strictly typed slots.
See TYPED-SLOT-CLASS
See DEFINE-TYPED-CLASS
typed-slot-class.lisp (file)
standard-object (class)
shared-initialize (method)
Slot class for slots with a strict type check.
See SLOT-TYPE
See TYPED-DIRECT-SLOT-DEFINITION
See TYPED-EFFECTIVE-SLOT-DEFINITION
See TYPED-SLOT-CLASS
typed-slot-class.lisp (file)
standard-slot-definition (class)
:slot-type
slot-type (generic function)
(setf slot-type) (generic function)
Metaclass for classes with strictly typed slots.
See TYPED-SLOT
See TYPED-OBJECT
typed-slot-class.lisp (file)
standard-class (class)
Previous: Definitions, Up: Top [Contents][Index]
• Concept index | ||
• Function index | ||
• Variable index | ||
• Data type index |
Next: Function index, Previous: Indexes, Up: Indexes [Contents][Index]
Jump to: | F L |
---|
Jump to: | F L |
---|
Next: Variable index, Previous: Concept index, Up: Indexes [Contents][Index]
Jump to: | (
A C D E F G I L M N O P R S T U V W |
---|
Jump to: | (
A C D E F G I L M N O P R S T U V W |
---|
Next: Data type index, Previous: Function index, Up: Indexes [Contents][Index]
Jump to: | *
A C E F I L N O P R S T U V |
---|
Jump to: | *
A C E F I L N O P R S T U V |
---|
Previous: Variable index, Up: Indexes [Contents][Index]
Jump to: | A B C D E F I J K L M N P R S T U W |
---|
Jump to: | A B C D E F I J K L M N P R S T U W |
---|