I created a programming language and this blog is powered by it
Why did I do it?
Mostly for fun.
If you follow my blog or take a look at some of the posts that I made, you will see that I was building a programming language called Grotksy. Just a toy programming language that I made based on the book Crafting Interpreters, which I totally recommend buying and reading if you haven't yet.
I wanted to build something interesting but simple enough that could be made with Grotsky. I tought that replacing Jekyll with my own engine was a task worth a try. There is nothing groundbreaking or innovative being made here, just a little experimentation.
I have to give credit to the project lith, because the 'templating' engine for the blog is inspired by it.
How did I do it?
That's a good question.
Originally, this blog was powered by Jekyll, that translated markdown to html and hosted by Github Pages. I decided that I was going to build a templating engine and generate html to keep things simple.
But also, as a challenge I made a simple HTTP server to use as a dev server when trying the blog locally.
HTTP Server
For the purpose of having a custom HTTP Server I had to add support for TCP sockets to the language. I wrapped the go standard library in some functions and exposed that to the Grotsky language. In grotsky looks something like this
let socket = net.listenTcp(host + ":" + port) let conn while true { try { conn = socket.accept() } catch err { io.println("Error accepting new connection", err) continue } try { # Call function that handles connection handleConn(conn) } catch err { io.println("Error handling connection", err) } try { conn.close() } catch err {} }
This means that the server listens on a socket, accepts connections, writes some text/bytes to the connection and then closes the connection.
Template Engine
The templating engine is built using the native support Grotsky provide for lists. A regular page for the blog looks like this:
let base = import("../base.gr") # Create new Post Object let post = base.Post( "Title", "Brief description of blog post.", "Author Name", "descriptive,tags", [ [ "h2", [], [ "Title" ] ], [ "div", ["class", "content"], [ "Content line 1", "Content line 2", ] ] ] )
It's pretty straightforward: the first element of the list is the html tag, the second is an array of properties for the tag and the last one is a list that contains what will be the *content* of enclosed by the tags.
Resources
If you want to take a peek, the source code for both projects is available on github: