javascript macros sweet.js

javascript - Sweet.js macro que llama un método



macros (1)

Por lo tanto, actualmente, en los tokens sweet.js vinculados a una variable de patrón :expr se envuelven en paréntesis para ayudar a que la precedencia funcione correctamente. Es una especie de truco y se solucionará pronto (más discusión aquí: https://github.com/mozilla/sweet.js/issues/314 ).

La solución simple para su ejemplo es simplemente no usar :expr ya que realmente no lo necesita:

macro mcall { rule { ($o, $m ...) } => { $o.$m ... } }

Nota al margen: using :expr es técnicamente incorrecto aquí ya que el RHS de a . no se permite que sea una expresión no restringida (por ejemplo, 2+4 coincide con $m:expr pero obj.2+4 es un error de sintaxis).

Estoy intentando escribir una macro sweet.js que necesita generar la sintaxis de llamada al método, obj.method() , pero el method se pasa a la macro como una expresión literal. Por ejemplo:

mcall(obj, toString().length); // becomes obj.toString().length;

Tengo algo que está cerca:

macro mcall { rule { ($o, $m:expr) } => { $o.$m } } mcall(obj, toString().length);

Sin embargo, esto aparentemente se expande a esto:

obj . ( toString ( ) . length );

¿De dónde vienen estos paréntesis adicionales y cómo me deshago de ellos? ¿Debo usar reglas de casos y #{} ? Probé las permutaciones de eso, pero aún así no pude generar una llamada a método sin paréntesis adicionales.