什么是在Sweet.js中干燥宏的技术?

时间:2015-02-24 21:51:39

标签: sweet.js

假设我有两个宏,除宏名称外是相同的:

macro h1 {
  case {$name ($x (,) ...)} => {
    letstx $nameVal = [makeValue(unwrapSyntax(#{$name}), null)]
    return #{React.createElement($nameVal, $x (,) ...)}
  }
}

macro h2 {
  case {$name ($x (,) ...)} => {
    letstx $nameVal = [makeValue(unwrapSyntax(#{$name}), null)]
    return #{React.createElement($nameVal, $x (,) ...)}
  }
}

我的代码重用选项有哪些?我可以让宏生成一个宏吗?

或者我可以将身体部分(以letstx...开头)最小化放置在自己的“内部”宏中吗?:

1 个答案:

答案 0 :(得分:1)

如下:

macro make_header {
  case {_ $name ($x (,) ...)} => {
    letstx $nameVal = [makeValue(unwrapSyntax(#{$name}), null)]
    return #{React.createElement($nameVal, $x (,) ...)}
  }
}

macro h1 {
  rule { ($x (,) ...) } => {
    make_header h1 ($x (,) ...) 
  }
}
macro h2 {
  rule { ($x (,) ...) } => {
    make_header h2 ($x (,) ...) 
  }
}

h1 (1, 2, 3)
h2 (1, 2, 3)