SweetJS:为特定库编写宏

SweetJS : Write a macro for a specific library

我目前正在做一个小项目,其中包括为 Ramda 编写宏。这是一个例子:

let map = macro {
    rule { $f $array } => { R.map($f, $array) }
    rule { $f } => { R.map($f) }
}

我试着编译这个简单的代码示例作为开始:

var R = require('ramda');

function log (value) {
    console.log(value);
}

map log [1, 2, 3];

出于卫生考虑,编译后的代码如下所示:

var R9 = require('ramda');
function log1(value2) {
    console.log(value2);
}                   
R.map(log1)[1, 2, 3];

我的问题是我不知道如何引用 ramda。

有没有人尝试为特定库编写宏并遇到这个问题?

目前实现它的方法有点老套。在下一个版本中,当我们获得 ES6 模块时,这实际上会自动为您处理,但在那之前最好的选择是拥有一个初始化宏(这就是 ki and contracts.js 所做的)。这是通过在所有宏的作用域中拥有一个共享变量,然后让用户首先调用执行必要的 require:

import 宏来实现的
var r_lib;
macro import {
    rule { $name from $path } => { 
        r_lib = require($path);
    }
}
let map = macro {
    rule { $f $l } => { r_lib.map($f, $l) }
}

import R from "ramda"

map log [1,2,3]