定义一个基于引用返回另一个函数的函数

时间:2020-05-25 11:02:17

标签: ocaml

以下代码无法正常运行:

const spellBtn = document.querySelector('.spell-btn');
const spellTextBox = document.querySelector('#spell-text');
let test = document.querySelector('.test');

const data = [
  {"spell": "Aberto" },
  { "spell": "Accio" },
  { "spell": "Age Line" },
  { "spell": "Aguamenti" }
];

function generateSpellBody(data) {
  let text = 'not a spell';

  for (let i = 0; i < data.length; i++) {
    if (data[i].spell === spellTextBox.value) {
      text = data[i].spell;
      break;
    }
  }

  test.innerHTML = text;
}

spellBtn.addEventListener('click', (e) => {
  e.preventDefault();
  generateSpellBody(data);
});

我希望它能输出

<form method='get'>
  <div class="form-group">
    <input type="text" class="form-control" id="spell-text" placeholder="Enter spell">
  </div>
  <button type="submit" class="spell-btn btn btn-default btn-light">Do spell</button>
</form>

<div class="test"></div>

但是只能打印

let debug_flag = ref false

let dprintf = let open Printf in
  match !debug_flag with
  | true -> printf
  | false -> ifprintf stdout

let test_dprintf () =
  begin
    debug_flag := true;
    Printf.printf "print1\n";
    dprintf "print2\n";
    Printf.printf "print3\n";
    debug_flag := false
  end

print1 print2 print3 中将print1 print3 分配给true似乎根本没有任何影响。

有人知道为什么吗?如果是这样,您知道一种可行的解决方法吗?

我正在使用OCaml 4.09.0

感谢您的回答

1 个答案:

答案 0 :(得分:2)

dprintf的定义不是函数表达式。它是一个将返回函数的表达式,但是仅在评估dprintf的定义时才会对表达式本身进行评估,而不是在调用它返回的函数时对其进行评估。

要解决此问题,您只需将参数明确:

let dprintf fmt = let open Printf in
  match !debug_flag with
  | true -> printf fmt
  | false -> ifprintf stdout fmt

现在dprintf的主体将在调用时进行评估。

相关问题