1

我目前正在做一个小项目,其中包括为 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 R$759 = require('ramda');
function log$761(value$762) {
    console.log(value$762);
}                   
R.map(log$761)[1, 2, 3];

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

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

4

1 回答 1

2

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

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]
于 2015-03-21T23:12:50.417 回答