Javascript 将Sweet.js表达式转换为字符串文字

Javascript 将Sweet.js表达式转换为字符串文字,javascript,macros,sweet.js,Javascript,Macros,Sweet.js,我正在尝试编写一个宏,将令牌转换为字符串。我当前的宏如下所示: macro stringify { case { $name($token) } => { letstx $tokenStr = [makeValue(unwrapSyntax(#{$token}), #{here})]; return #{ $tokenStr } } case { $na

我正在尝试编写一个宏,将令牌转换为字符串。我当前的宏如下所示:

macro stringify {
    case {
        $name($token)
    } => {
        letstx $tokenStr = [makeValue(unwrapSyntax(#{$token}), #{here})];
        return #{
            $tokenStr
        }
    }

    case {
        $name($token $rest ... )
    } => {
        return #{
            stringify($token) , stringify($rest ...)
        }
    }
}
这可以很好地将标识符转换为字符串,但无法将文本或表达式转换为字符串。以下是我的测试用例及其编译内容:

stringify(a b 7 d e foo 5+9)
'a', 'b', 7, 'd', 'e', 'foo', 5, '+', 9;
汇编成:

stringify(a b 7 d e foo 5+9)
'a', 'b', 7, 'd', 'e', 'foo', 5, '+', 9;
我想把它编译成:

'a', 'b', '7', 'd', 'e', 'foo', '5+9';
我假设我可以通过使用
expr
pattern类来实现这一点,但当我这样做时,我收到以下错误:

/usr/local/lib/node_modules/sweet.js/lib/sweet.js:99
                    throw new SyntaxError(syn.printSyntaxError(source$2, err))
                          ^
SyntaxError: [makeValue] Cannot make value syntax object from: [object Object]
    at expand$2 (/usr/local/lib/node_modules/sweet.js/lib/sweet.js:99:27)
    at parse (/usr/local/lib/node_modules/sweet.js/lib/sweet.js:135:29)
    at Object.compile (/usr/local/lib/node_modules/sweet.js/lib/sweet.js:143:19)
    at Object.exports.run (/usr/local/lib/node_modules/sweet.js/lib/sjs.js:70:45)
    at Object.<anonymous> (/usr/local/lib/node_modules/sweet.js/bin/sjs:7:23)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10
/usr/local/lib/node\u modules/sweet.js/lib/sweet.js:99
抛出新的SyntaxError(syn.printSyntaxError(source$2,err))
^
SyntaxError:[makeValue]无法从:[object object]生成值语法对象
扩展$2(/usr/local/lib/node_modules/sweet.js/lib/sweet.js:99:27)
解析时(/usr/local/lib/node_modules/sweet.js/lib/sweet.js:135:29)
在Object.compile(/usr/local/lib/node_modules/sweet.js/lib/sweet.js:143:19)
在Object.exports.run(/usr/local/lib/node_modules/sweet.js/lib/sjs.js:70:45)
反对。(/usr/local/lib/node_modules/sweet.js/bin/sjs:7:23)
在模块处编译(Module.js:456:26)
在Object.Module.\u extensions..js(Module.js:474:10)
在Module.load(Module.js:356:32)
在Function.Module.\u加载(Module.js:312:12)
在Function.Module.runMain(Module.js:497:10
这似乎是由于
makeValue
函数无法处理表达式造成的


如果有人能为我提供一些见解,我将不胜感激。

因此
expr
s将是一组您需要映射的令牌。 简单的例子:

macro str_expr {

    case {
        _ ($toks:expr)
    } => {
        var toks = #{$toks};
        var toks_str = toks.map(function(tok) { return unwrapSyntax(tok); }).join("");
        letstx $tok_str = [makeValue(toks_str, #{here})];
        return #{
             $tok_str
        }
    }
}

str_expr (2 + 4)
// expands to '2+4'

您只需分别处理普通令牌案例和
:expr
案例。

这是timdiney答案的修改版本

macro str_expr {

    case {
        _ ($toks:expr)
    } => {
        var toks = #{$toks};
        var toks_str = unwrapSyntax(toks[0]).inner.map(function(tok) {
            return unwrapSyntax(tok);
        }).join("");

        letstx $tok_str = [makeValue(toks_str, #{here})];
        return #{
             $tok_str
        }
    }
}

console.log(str_expr (2+ 4+7 - 9 + a));
// expands into "2+3+7-9+a"

当我运行它时,它会扩展为
“[object object]”