Swizec Teller - a geek with a hatswizec.com

    The strangestest Hello World I ever made

    • Le Belem

      Image by 0k1n via Flickr

    Earlier this week while under the influence of being stressed out of my mind being CEO of a startup and watching way too much Sherlock (there are only three episodes, watched every one at least four times) I decided that it was time for a new hobby.

    The only requirements for said hobby were:

    • mentally very bloody stimulating
    • doable in polynomic time (rules out things like 'invent cold fusion')
    • learn something new

    Obviously the only real solution to this problem is designing a new programming language and making a compiler or interpreter for it. Sure, the other obvious solution is to find a cool opensource project and become an Important Contributor (tm). But I'm gonna do that anyway, contribute code I'm developing at Preona to opensource projects that is.

    No I needed something completely different. Totally unrelated to my daily work and so on. Making a language it was!

    Because @skatey reminded me of Monkey Island earlier that day the language is called Murray.

    Murray is a talking demonic skull in Monkey Island.

    This led to some interesting design ideas. Since obviously the language needs to be inspired by the demonic talking skull ... so let's make the whole thing behave like you're talking to the computer rather than programming.

    Oh also I wanted it to run on Python and be inspired by Lisp, but without parentheses. No parentheses if at all avoidable!

    Another big design goal is to eventually write a Murray-to-Python compiler in Murray. Right now I'm writing it in Python.

    So let's recap the primary design goals

    • functional
    • no parentheses
    • as akin to talking as possible
    • can compile itself
    • Turing complete

    The hello world

    The hello world turns out to be pretty simple.

    say "Hello World"

    Compiles to python and works. And no, no I'm not just using a regex to replace 'say' with 'print'. I actually wrote a parser for this thing.

    Everything that sticks together is considered a paragraph of code and will essentially evaluate to a big function composition like so f(g(h(x))). Ok? ok.

    So when I write this:

    say "hello world" say "meow" say "hai"

    It compiles into something a bit like so: say( "hello world", say("meow", say("hai")))

    So the output becomes:

    hai None meow None hello world

    Which doesn't seem too logical, the None should go on the other side ... I should fix this.

    But anyway, the None is there because 'say' doesn't return anything, we can fix the wonky output like this:

    say "hello world". say "meow". say "hai"

    What magic buffonery is this!?

    Well the dot is another function again and Murray can understand one-char functions even when they are attached to something else. The dot is a simple function anyway, it sort of 'destroys' output by returning an empty string so it doesn't get in the way later on in the execution stack.

    But what about them code paragraphs I mentioned earlier? Well their intended use eventually is to define 'functions', but I haven't figured this out too much yet. Right now they just do this:

    say "meow1"
    say "meow2"

    This compiles into two distinct function calls so the output is like this:

    meow1 meow2

    Anyway, that's all I've got figured out so far. It's only been a few days since I started working on this and there's a long way still to go. Suggestions very welcome, contributors appreciated, everything is open source and living on github. Just fork and ping me about it if you're interested :)

    Oh yeah, this Hello World is strange because it took me writing a compiler and making up a lot of stuff.

    Enhanced by Zemanta

    Did you enjoy this article?

    Published on August 19th, 2010 in Compiler, Languages, Lisp, Murray, Open source, Programming, Programming language, python, Turing completeness, Uncategorized

    Learned something new?
    Want to become an expert?

    Here's how it works 👇

    Leave your email and I'll send you thoughtfully written emails every week about React, JavaScript, and your career. Lessons learned over 20 years in the industry working with companies ranging from tiny startups to Fortune5 behemoths.

    Join Swizec's Newsletter

    And get thoughtful letters 💌 on mindsets, tactics, and technical skills for your career. Real lessons from building production software. No bullshit.

    "Man, love your simple writing! Yours is the only newsletter I open and only blog that I give a fuck to read & scroll till the end. And wow always take away lessons with me. Inspiring! And very relatable. 👌"

    ~ Ashish Kumar

    Join over 14,000 engineers just like you already improving their careers with my letters, workshops, courses, and talks. ✌️

    Have a burning question that you think I can answer? I don't have all of the answers, but I have some! Hit me up on twitter or book a 30min ama for in-depth help.

    Ready to Stop copy pasting D3 examples and create data visualizations of your own?  Learn how to build scalable dataviz components your whole team can understand with React for Data Visualization

    Curious about Serverless and the modern backend? Check out Serverless Handbook, modern backend for the frontend engineer.

    Ready to learn how it all fits together and build a modern webapp from scratch? Learn how to launch a webapp and make your first 💰 on the side with ServerlessReact.Dev

    Want to brush up on your modern JavaScript syntax? Check out my interactive cheatsheet: es6cheatsheet.com

    By the way, just in case no one has told you it yet today: I love and appreciate you for who you are ❤️

    Created bySwizecwith ❤️