Making a programming language Part 7a - objects


Table of contentsWhole project on github

My goal in this post is for this to compile

func create(n){this}

and a call to it to return a reference to an object that contains “n”. Functions are a bit different from the rest of the language. Not by implementation or usage but by thought process behind designing them. I actually thought about objects and functions before implementing any of them. Considering my implementation of scopes(which I like) and shadowing I got this great idea that functions, scopes and objects are just many faces of the same thing. Or “could be” many faces of the same thing. Something a bit more powerful than a function being the “thing”. Let’s see how that works. A function in this language needs a new local scope for every execution(not all functions, but this is a simplification because I don’t care about performance, see previous post for details). New scope. New something. New. Bells should be ringing right now. I’m creating objects. I could just as well pass the reference to that object. I even have the reference. It’s current scope - “this” in scala code. So I just need a language construct to access that. How about “this”.

1
2
//in SScope body
map.put("this", this)

Not even a language construct, just a magic variable. You can even shadow it. Anticlimactic? I hope so. The whole point of object is that it’s just another view on function. I could end the post here but I want to show why this is awesome(and therefore why I’m proud of it)

Privates

You don’t even need access modifiers, you can use shadowing and nesting

func private(n) {
    that = this
    func (){
        func get() { that.n }
        func set(v) { that.n = v }
        this
    }()
}

This is a constructor that returns an object with functions get and set(but no n!). Outer object is available through its alias via nesting. And returned value is the last expression - an immediately invoked lambda(cumbersome syntax..gotta do something about that). However, this is not bullet-proof

o = private(1)
o.that = func(){
           n=3
           this
         }
o.get()

Returns 3. Though knowledge of implementation is needed to execute such attack. update: I kinda sorta forgot to include how I made that dot-access thingy-o.get() to work. Continuation below

next: using objects


Last modified on 2012-09-27

Previous Making a programming language Part 6 - functions
Next Making a programming language Part 8 - going faster