Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

assignment destructuring #9

Open
francescoagati opened this issue Jun 5, 2015 · 1 comment
Open

assignment destructuring #9

francescoagati opened this issue Jun 5, 2015 · 1 comment

Comments

@francescoagati
Copy link

What you think about assignment destructuring in tink_lang?

for arrays for example

      var x = 1;
      var y = 2;
      var z = 3;
      [a,b,c] = [x,y,z];
become
      var a = x;
      var b = y;
      var c = z;

and object destructuring

      var person = {name:'mario',surname:'rossi',age:25};
      [name,surname] << person;
become
      var name = person.name;
      var surname = person.surname;
@francescoagati
Copy link
Author

This is the code for make the test


import haxe.macro.Expr;
using haxe.macro.ExprTools;
using haxe.macro.MacroStringTools;

class Main {

  static function processDestructuring(e:Expr) {
    return switch e {
      case macro [$a{lefts}] = [$a{rights}]:
        var cnt = 0;
        var blocks = [ for (left in lefts) {
             var valueLeft = left.toString();
             var right = rights[cnt];
            cnt++;
            macro var $valueLeft = $e{right};
        }];
        macro $b{blocks};
      case macro [$a{lefts}] << ${right}: {
        var cnt = 0;
        var blocks = [ for (left in lefts) {
            var valueLeft = left.toString();
            cnt++;
            macro var $valueLeft = $right.$valueLeft;
        }];
        macro $b{blocks};
      }
      case _:e.map(processDestructuring);
    }
  }

  public static macro function testDestructuring(e:Expr) {
    return e.map(processDestructuring);
  }

  public static function main() {
    testDestructuring({
      var x = 1;
      var y = 2;
      var z = 3;
      var person = {name:'mario',surname:'rossi',age:25};
      trace(person);

      [name,surname] << person;
      [a,b,c] = [x,y,z];
    });
  }

}


and the code generated for js

(function (console) { "use strict";
var HxOverrides = function() { };
HxOverrides.iter = function(a) {
    return { cur : 0, arr : a, hasNext : function() {
        return this.cur < this.arr.length;
    }, next : function() {
        return this.arr[this.cur++];
    }};
};
var Main = function() { };
Main.main = function() {
    var x = 1;
    var y = 2;
    var z = 3;
    var person = { name : "mario", surname : "rossi", age : 25};
    console.log(person);
    var name = person.name;
    var surname = person.surname;
    var a = x;
    var b = y;
    var c = z;
};
Main.main();
})(typeof console != "undefined" ? console : {log:function(){}});


Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant