调用另一个源代码块中定义的函数

Call a function defined in another source block

我正在尝试使用 org-babel 在读写程序中进行简单的单元测试。

我的想法是定义一个函数(的主体),就像这样

#+NAME: square
#+BEGIN_SRC js :var x=0
return x*x;
#+END_SRC

当然,我还需要实际创建一个用于缠结的函数,我可以通过

#+BEGIN_SRC js :noweb tangle :tangle the-script.js
function square(x) {
    <<square>>
}
#+END_SRC

然后我会设置一个table的测试值,像这样

#+TBLNAME: squares-test-data
| the square of |      is |
|---------------+---------|
|             0 |       0 |
|             1 |       1 |
|            10 |     100 |
|            12 |     144 |
|             4 |      16 |
|             9 |      81 |
|           100 |   10000 |
|           234 | 8273424 | 

问题是,我如何使用此数据 运行 从单独的块 测试函数体 ,请记住

基本上,我想做的是这样的:

#+BEGIN_SRC js :var table=squares-test-data
// Import square block here somehow?

return table.map(function(row) {
    var input = row[0],
        expected = row[1],
        got = square(input),  // this won't be defined
        passed = got == expected;
    return [input, expected, passed]
});
#+END_SRC

但是这个块没有 "know about" 另一个块。

有什么想法吗?

这主要只是一个简单的疏忽。

可以 "import" 以这种方式在评估之前将块插入其他块:

#+BEGIN_SRC js :noweb eval
<<code-under-test>>
// run some tests
#+END_SRC

我太习惯于使用 :noweb tangle 以至于我没有意识到还有其他选择。 :noweb eval 确保块在评估之前纠结,这就是我在这里想要的。

就是说,我确实发现在大多数情况下,组织表作为 输入源 是行不通的,但我有一个令人满意的替代方案,我已经写过并将 link 发布到这里。