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.