0

如何将任意字符串插入到 sweet.js 生成的输出中?

这对于以编程方式执行字符串根据各种条件不同的事情非常有用。

例如,在下面代码的第 25 行,我想插入一个字符串作为结果。

sweet.js 代码:

    import { produceNormalParams } from './abc/produceNormalParams'
    import { produceParamChecks }  from './abc/produceParamChecks'
    import { produceInnerChecks }  from './abc/produceInnerChecks'

    syntax function = function(ctx) {
        let funcName   = ctx.next().value;
        let funcParams = ctx.next().value;
        let funcBody   = ctx.next().value;

        //produce the normal params array
        var normalParams = produceNormalParams(funcParams)

        //produce the checks
        var paramChecks = produceParamChecks(funcParams)

        //produce the original funcBody code
        var inner = produceInnerChecks(funcParams)

        var someArbitraryString = "console.log('hey')"

        //put them together as the final result
        var result = #`function ${funcName} ${normalParams} {
            ${someArbitraryString}
            ${paramChecks}
            ${inner}
        }`

        return result
    }

示例输入:

    module.exports = multiply

    function multiply(a:array,b,c:array) {
        return a * c
    }

示例输出:

    // Example Output
    module.exports = multiply;
    function multiply(a_31, b_32, c_33) {
        console.log('hey')
        if (Object.prototype.toString.call(a_31) !== "[object Array]") throw new Error("Must be array:" + a_31);
        if (Object.prototype.toString.call(c_33) !== "[object Array]") throw new Error("Must be array:" + c_33);
        return a_31 * c_33;
    }
4

1 回答 1

1

虽然您不能将任意字符串插入到语法模板中,但您可以插入其他语法模板。

import { produceNormalParams } from './abc/produceNormalParams' for syntax;   
import { produceParamChecks }  from './abc/produceParamChecks' for syntax;
import { produceInnerChecks }  from './abc/produceInnerChecks' for syntax;

syntax function = function(ctx) {
    let funcName   = ctx.next().value;
    let funcParams = ctx.next().value;
    let funcBody   = ctx.next().value;

    //produce the normal params array
    var normalParams = produceNormalParams(funcParams);

    //produce the checks
    var paramChecks = produceParamChecks(funcParams);

    //produce the original funcBody code
    var inner = produceInnerChecks(funcParams);

    var someArbitrarySyntax = #`console.log('hey')`;

    //put them together as the final result
    var result = #`function ${funcName} ${normalParams} {
        ${someArbitrarySyntax}
        ${paramChecks}
        ${inner}
    }`;

    return result
}

注意for syntax后面的 import 语句。这些对于在编译期间可用的导入是必需的。

于 2017-05-02T12:22:57.823 回答