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".
//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
However, this is not bullet-proof
update: I kinda sorta forgot to include how I made that dot-access thingy-o.get() to work. Continuation below
next: using objects
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
No comments:
Post a Comment