On Sunday, July 8, 2012 at 6:05 AM, Vyacheslav Egorov wrote:

> WeakMap/Map/Set are available in V8 for quite some time. You just need to run 
> with --harmony.
> 
> 


I'm not sure I understand what the point your trying to make is. I said "stable 
v8" which is meant to imply "not behind a flag". If there are "hard to explain 
memory leaks", that's a bug and should be reported.

Why would you use a WeakMap for use case that required strings as keys? This is 
like using a chainsaw to cut bread.

Rick

> (Though storing anything in a WeakMap with a string key might lead to a hard 
> to explain memory leaks). 
> Vyacheslav Egorov
> On Jul 7, 2012 6:28 PM, "Rick Waldron" <[email protected] 
> (mailto:[email protected])> wrote:
> > 
> > 
> > 
> > On Saturday, July 7, 2012 at 10:28 AM, Mariusz Nowak wrote:
> > 
> > > This is the use case we were missing, you want to do same thing I've once 
> > > tried to do in domjs https://github.com/medikoo/domjs
> > > Currently I think there's no better solution than polluting global scope.
> > > In domjs I resolved it by introducing dynamic scope ( 
> > > https://github.com/medikoo/domjs/blob/master/lib/dscope.js ).
> > > 
> > > 
> > > 
> > 
> > 
> > This is a good use case for WeakMaps; they aren't available in v8 stable 
> > yet, but would eliminate the leaky references that could be held in the 
> > current implementation. 
> > 
> > Rick
> > 
> > 
> >  
> > >  but it's not great approach as variable assignments live only during 
> > > function execution, and that's confusing. I think best solution would to 
> > > be have possibility to run modules in some predefined lexical scope, but 
> > > it's not that easy to achieve.
> > > 
> > > On Saturday, July 7, 2012 3:55:26 PM UTC+2, ajlopez wrote:
> > > > Thanks!
> > > > 
> > > > I usually do in your suggested way, and I'm with you. But in this 
> > > > special case, I feel the user of my module could find a bit weird to 
> > > > write 
> > > > 
> > > > var st = require('simpletags'); 
> > > > 
> > > > st.html(st.head(st.title('...')), st.body(st.h1(....))
> > > > 
> > > > instead
> > > > 
> > > > html(head(title('....')), body(h1('...'))
> > > > 
> > > > in a controlled way (only in its own module). I want to give him/her an 
> > > > option. Ruby has it (as an option, too). It's the first time I found I 
> > > > needed it in Node.js. Usually, I assert "Ruby ceremony > 
> > > > Javascript/Node.js ceremony", but now, I was trapped by this issue. 
> > > > 
> > > > My best solutions:
> > > > 
> > > > a)
> > > > var st = require(...); // and use with st.h1, st.h2...
> > > > 
> > > > b)
> > > > require('simpletags').exportsTo(global); // maybe in browser I could 
> > > > export to windows directly in the module
> > > > 
> > > > c)
> > > > var simpletags = require('simpletags');
> > > > eval(simpletags.exportLocalCode()); // where .exportLocalCode returns a 
> > > > String with "var h1 = simpletags.h1; ... "
> > > > c2)
> > > > var st = require('simpletags');
> > > > eval(st.exportLocalCode('st')); // the local variable name 'st' should 
> > > > be informed to be used in var ...= .... string result
> > > > 
> > > > On Sat, Jul 7, 2012 at 10:38 AM, Mariusz Nowak <[email protected] 
> > > > (mailto:[email protected])> wrote:
> > > > > In modules you can achieve the same by assigning function to global: 
> > > > > e.g. `global.foo = function () { .. }` it will work same as `this.foo 
> > > > > = function () { ... }` in REPL. but I would strongly discourage this, 
> > > > > relying on global scope is bad practice. 
> > > > > 
> > > > > I'd say that unless you're using regular require/export logic to 
> > > > > share objects between modules, you're doing something wrong. Try to 
> > > > > think just with require/exports and then you should quickly find way 
> > > > > home. See how module relations in other packages work.
> > > > > 
> > > > > -- 
> > > > > Mariusz Nowak
> > > > > https://github.com/medikoo
> > > > > http://twitter.com/medikoo
> > > > > 
> > > > > 
> > > > > On Saturday, July 7, 2012 3:18:51 PM UTC+2, ajlopez wrote:
> > > > > > Thanks for the suggestion!.... but...  I missing some part of your 
> > > > > > answer.
> > > > > > 
> > > > > > I guess I understand the difference btw global, this.property, and 
> > > > > > var local. And then, I understand why it not works. What I don't 
> > > > > > understand is how to circumvent/solve the problem. I don't know if 
> > > > > > your answer is:
> > > > > > 
> > > > > > a- " you'll get the answers :) " and then, you will know that it's 
> > > > > > impossible to solve, or too weird
> > > > > > b-  you'll get the answers :) " and it's possible in this (simple) 
> > > > > > way.....etc...
> > > > > > 
> > > > > > AFAIK, it's "a". Am I right?
> > > > > > 
> > > > > > My problem is:
> > > > > > 
> > > > > > - module1 requires module2
> > > > > > - I want to use the exposed functions of module2 as they were 
> > > > > > defined in module1, using dynamic names. That is, it's not a 
> > > > > > solution
> > > > > > 
> > > > > > var module2 = require('module2'); 
> > > > > > var Function2 = module2.Function2;
> > > > > > 
> > > > > > Usually, I did a bit of experiment at REPL. I found that this works:
> > > > > > 
> > > > > > var name = 'Function2';
> > > > > > this[name] = ...
> > > > > > 
> > > > > > var obj = new Function2(); // without using this
> > > > > > 
> > > > > > BUT it's only works at REPL. So, encouraged by this discovery (I 
> > > > > > expected it will not work), I hoped to make it works in other 
> > > > > > context. 
> > > > > > 
> > > > > > Now, I understand why it is work in REPL. Notably, in REPL
> > > > > > 
> > > > > > this == global
> > > > > > 
> > > > > > so it's possible to emulate
> > > > > > 
> > > > > > var foo = ... 
> > > > > > 
> > > > > > with something like (pseudocode)
> > > > > > 
> > > > > > name = 'foo'
> > > > > > var [name] = .....
> > > > > > 
> > > > > > writing
> > > > > > 
> > > > > > name = 'foo';
> > > > > > this[name] = ...
> > > > > > 
> > > > > > and then foo is available "as if it is" a local var.
> > > > > > 
> > > > > > But inside a running .js, this is not equal to global. I was 
> > > > > > tricked by REPL ;-)
> > > > > > 
> > > > > > So, the better solution I found so far is to put something like 
> > > > > > this in module1: 
> > > > > > // 
> > > > > > http://stackoverflow.com/questions/5625569/include-external-js-file-in-node-js-app
> > > > > >  
> > > > > > 
> > > > > > var fs = require('fs');
> > > > > > var vm = require('vm');
> > > > > > 
> > > > > > var includeInThisContext = function(path) {
> > > > > >     var code = fs.readFileSync(path);
> > > > > >     vm.runInThisContext(code, path);
> > > > > > }.bind(this);
> > > > > > 
> > > > > > includeInThisContext(__dirname + '/module2.js');
> > > > > > 
> > > > > > console.log(foo); // it's defined 
> > > > > > 
> > > > > > where module2  define foo:
> > > > > > 
> > > > > > foo = {};
> > > > > > 
> > > > > > BUT IN MY CASE, module2 doesn't define the functions at its own 
> > > > > > context:
> > > > > > https://github.com/ajlopez/SimpleTags/blob/master/lib/simpletags.js 
> > > > > > it uses an array to dynamically define and export functions.  I 
> > > > > > never have
> > > > > > 
> > > > > > function h1() {
> > > > > > }
> > > > > > 
> > > > > > function h2() {
> > > > > > }
> > > > > > 
> > > > > > defined at module2 context. And I don't want this. My DSL defines a 
> > > > > > function for each HTML tag.  
> > > > > > 
> > > > > > Now, I want to have these dynamically defined functions from 
> > > > > > module2 accessible in outer module1, as they were local to it.
> > > > > > 
> > > > > > I could write inside my module,
> > > > > > 
> > > > > > var h1 = makeTag('h1');
> > > > > > var h2 = makeTag('h2");
> > > > > > ...
> > > > > > ....
> > > > > > 
> > > > > > for dozens of tags, and then use something like 
> > > > > > includeInThisContext.... but I feel it's too weird. 
> > > > > > 
> > > > > > Apparently, my problem is: I didn't find a way to define a local 
> > > > > > var with a dynamic name.
> > > > > > 
> > > > > > The original DSL in Ruby:
> > > > > > https://github.com/dlitvakb/deklarativna/blob/master/test/test_deklarativna.rb
> > > > > >  
> > > > > > 
> > > > > > use "include dslmodule". And inside the dsl module, it defines 
> > > > > > dynamically named functions at module top level. So the functions 
> > > > > > are automatically available to the module that makes the includes.  
> > > > > > 
> > > > > > That is the "trick" I didn't found how to emulate in 
> > > > > > Node.js/require/CommonJS world.
> > > > > > 
> > > > > > Some links in my research:
> > > > > > http://stackoverflow.com/questions/5833978/javascript-how-to-use-dynamic-local-variables
> > > > > >  
> > > > > > http://stackoverflow.com/questions/5094862/how-do-i-access-a-local-variable-dynamically-via-a-string-form-of-its-name-fro
> > > > > >  
> > > > > > http://stackoverflow.com/questions/598878/how-can-i-access-local-scope-dynamically-in-javascript
> > > > > >  
> > > > > > http://stackoverflow.com/questions/2336508/javascript-get-access-to-local-variable-or-variable-in-closure-by-its-name
> > > > > >  
> > > > > > http://stackoverflow.com/questions/1119335/javascript-local-variable-declare
> > > > > >  
> > > > > > 
> > > > > > The better approach I found in these links is to use eval (!!??):
> > > > > > eval("var "+name+ " = ....");
> > > > > > 
> > > > > > Am I right? the only ways are the above ones? Or is another way? 
> > > > > > 
> > > > > > Any suggestions?
> > > > > > 
> > > > > > Angel "Java" Lopez
> > > > > > 
> > > > > > 
> > > > > > On Sat, Jul 7, 2012 at 9:27 AM, Mariusz Nowak <[email protected] 
> > > > > > (mailto:[email protected])> wrote:
> > > > > > > @ajlopez get to know how variable scoping in JavaScript works 
> > > > > > > (what is global, how this and how local variable works), and 
> > > > > > > you'll get the answers :)
> > > > > > > 
> > > > > > > 
> > > > > > > On Saturday, July 7, 2012 2:11:56 PM UTC+2, ajlopez wrote:
> > > > > > > > Hi people!
> > > > > > > > 
> > > > > > > > A very simple question. When I write in the Node repl:
> > > > > > > > 
> > > > > > > > this.foo = 'bar';
> > > > > > > > console.log(foo);
> > > > > > > > 
> > > > > > > > it's ok, foo is defined. But writing that code in file.js and 
> > > > > > > > running 
> > > > > > > > 
> > > > > > > > node file.js
> > > > > > > > 
> > > > > > > > then foo is not defined.
> > > > > > > > 
> > > > > > > > Or require('file.js'), then foo is not defined.
> > > > > > > > 
> > > > > > > > Any way to define a variable in the "current context"? 
> > > > > > > > Apparently, "this" properties and "current context" top 
> > > > > > > > variables are the same in REPL, but they are not the same in 
> > > > > > > > .js, or inside a required module. 
> > > > > > > > 
> > > > > > > > I want to do this in a dynamic way:
> > > > > > > > 
> > > > > > > > name = 'foo';
> > > > > > > > // ...
> > > > > > > > this[name] = 'bar';
> > > > > > > > 
> > > > > > > > so
> > > > > > > > 
> > > > > > > > foo = 'bar'; 
> > > > > > > > 
> > > > > > > > is not a solution in my context.
> > > > > > > > 
> > > > > > > > I could use:
> > > > > > > > 
> > > > > > > > global[name] = 'bar';
> > > > > > > > 
> > > > > > > > but I want to expose the new "current context" top variables 
> > > > > > > > only in my "current context" without pollute the global 
> > > > > > > > environment. 
> > > > > > > > 
> > > > > > > > I encountered this problem when coding a simple HTML DSL:
> > > > > > > > https://github.com/ajlopez/SimpleTags/blob/master/test/exportsTo.js
> > > > > > > >  
> > > > > > > > I want the DSL functions to be accesible as:
> > > > > > > > 
> > > > > > > > require('simpletags').exportsTo(????); // ???? == global? this? 
> > > > > > > > Now, I should use global to make it works in any situation 
> > > > > > > > 
> > > > > > > > then, use the exported function as functions in current context:
> > > > > > > > 
> > > > > > > > html(body(h1("TheNextBigThing")));
> > > > > > > > instead 
> > > > > > > > 
> > > > > > > > var st = require("simpletags");
> > > > > > > > 
> > > > > > > > st.html(st.body(st.h1("TheNextBigThing")));
> > > > > > > > 
> > > > > > > > Any other way?
> > > > > > > > 
> > > > > > > > TIA 
> > > > > > > > 
> > > > > > > > Angel "Java" Lopez
> > > > > > > > http://ajlopez.wordpress.com
> > > > > > > > @ajlopez
> > > > > > > > gh:ajlopez
> > > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > -- 
> > > > > > > Job Board: http://jobs.nodejs.org/
> > > > > > > Posting guidelines: 
> > > > > > > https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
> > > > > > > You received this message because you are subscribed to the Google
> > > > > > > Groups "nodejs" group.
> > > > > > > To post to this group, send email to [email protected] 
> > > > > > > (mailto:[email protected])
> > > > > > > To unsubscribe from this group, send email to
> > > > > > > [email protected] 
> > > > > > > (mailto:nodejs%[email protected])
> > > > > > > For more options, visit this group at
> > > > > > > http://groups.google.com/group/nodejs?hl=en?hl=en
> > > > > > 
> > > > > -- 
> > > > > Job Board: http://jobs.nodejs.org/
> > > > > Posting guidelines: 
> > > > > https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
> > > > > You received this message because you are subscribed to the Google
> > > > > Groups "nodejs" group.
> > > > > To post to this group, send email to [email protected] 
> > > > > (mailto:[email protected])
> > > > > To unsubscribe from this group, send email to
> > > > > [email protected] 
> > > > > (mailto:nodejs%[email protected])
> > > > > For more options, visit this group at
> > > > > http://groups.google.com/group/nodejs?hl=en?hl=en
> > > > 
> > > -- 
> > > Job Board: http://jobs.nodejs.org/
> > > Posting guidelines: 
> > > https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
> > > You received this message because you are subscribed to the Google
> > > Groups "nodejs" group.
> > > To post to this group, send email to [email protected] 
> > > (mailto:[email protected])
> > > To unsubscribe from this group, send email to
> > > [email protected] 
> > > (mailto:nodejs%[email protected])
> > > For more options, visit this group at
> > > http://groups.google.com/group/nodejs?hl=en?hl=en
> > 
> > -- 
> > Job Board: http://jobs.nodejs.org/
> > Posting guidelines: 
> > https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
> > You received this message because you are subscribed to the Google
> > Groups "nodejs" group.
> > To post to this group, send email to [email protected] 
> > (mailto:[email protected])
> > To unsubscribe from this group, send email to
> > [email protected] 
> > (mailto:nodejs%[email protected])
> > For more options, visit this group at
> > http://groups.google.com/group/nodejs?hl=en?hl=en
> -- 
> Job Board: http://jobs.nodejs.org/
> Posting guidelines: 
> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
> You received this message because you are subscribed to the Google
> Groups "nodejs" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group at
> http://groups.google.com/group/nodejs?hl=en?hl=en

-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

Reply via email to