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]
我目前正在做一个小项目,其中包括为 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]