I am putting together a networking library atop usocket for use in a multiplayer Lisp game. So far, I have implemented a library for serializing data into a byte buffer.
Here is a simple example of serializing some things into a buffer:
(make-enum-serializer :opcode (:login :run :jump :logout))
(make-bitfield-serializer :login-flags (:hidden :stay-logged-in))
(serialize* (:opcode :login
:uint32 sequence-number
:login-flags '(:hidden)
:string login-name
:string password) buffer)
(make-bitfield-serializer :login-flags (:hidden :stay-logged-in))
(serialize* (:opcode :login
:uint32 sequence-number
:login-flags '(:hidden)
:string login-name
:string password) buffer)
You can unserialize those bits into existing places:
(let (opcode sequence-number flags login-name password)
(unserialize* (:opcode opcode
:uint32 sequence-number
:login-flags flags
:string login-name
:string password) buffer)
...)
(unserialize* (:opcode opcode
:uint32 sequence-number
:login-flags flags
:string login-name
:string password) buffer)
...)
You can unserialize them into newly-created variables for use within a body:
(unserialize-let* (:opcode opcode
:uint32 sequence-number
:login-flags flags
:string login-name
:string password) buffer
...)
:uint32 sequence-number
:login-flags flags
:string login-name
:string password) buffer
...)
Or, you can unserialize them into a list:
(let ((parts (unserialize-list* (:opcode
:uint32
:login-flags
:string
:string) buffer)))
...)
:uint32
:login-flags
:string
:string) buffer)))
...)
You can find out more about the serialization library on my unet page.