nim-wiki/Writing-a-Macro.md

26 lines
1.2 KiB
Markdown
Raw Normal View History

2013-05-26 21:28:10 +00:00
Macros are complex and powerful, allowing you to build the AST imperatively. So how does one build AST? It's not as hard as it sounds.
2013-05-26 21:32:32 +00:00
I'm going to go over the process I used to write the marshaling macro used in keineSchweine (github/fowlmouth/keineSchweine/dependencies/genpacket)
2013-05-26 21:28:10 +00:00
Okay, so I have described a packet as a object type holding the information needed, for example a packet that gets sent out to clients when a new client connects might look like this:
```nimrod
type TClientJoined = object
playerID: int
alias: string
```
To make this useful, I'd like to build the TClientJoined with the information needed and write it a stream, and have a function that takes a stream and reads from it into a TClientJoined
```nimrod
# writeBE and readBE are reading/writing functions that will read/write in big endian
proc write (packet: var TClientJoined; stream: PStream) =
writeBE stream, packet.playerID
writeBE stream, packet.alias
proc readClientJoined (stream: PStream): TClientJoined =
readBE stream, result.playerID
readBE stream, result.alias
```
2013-05-26 21:32:32 +00:00
As you can see, this will result in a specialized function for reading/writing a certain type of packet
2013-05-26 21:28:10 +00:00
2013-05-26 21:32:32 +00:00
to be continued
2013-05-26 21:28:10 +00:00