小编Bel*_*ela的帖子

如何避免使用延续传递样式的堆栈?

对于我的毕业论文,我选择执行ICFP 2004竞赛的任务.

任务 - 我将其翻译成自己 - 是编写一个编译器,将高级蚂蚁语言翻译成低级蚂蚁组件.在我的例子中,这意味着使用用Clojure(一种Lisp方言)编写的DSL作为产生蚂蚁组装的高级蚂蚁语言.

更新:

ant-assembly有几个限制:没有用于调用函数的汇编指令(也就是说,我无法写入CALL function1, param1),也没有从函数返回,也没有将返回地址压入堆栈.此外,根本没有堆栈(用于传递参数),也没有任何堆或任何类型的内存.我唯一拥有的是GOTO/JUMP指令.

实际上,ant-assembly用于描述状态机的转换(=蚂蚁的"大脑").对于"函数调用"(=状态转换),我所有的都是JUMP/GOTO.

虽然没有像堆栈,堆或适当的CALL指令那样的东西,但我仍然希望能够在ant-assembly中调用函数(通过JUMPing到某些标签).在几个地方,我读到将Clojure DSL函数调用转换为延续传递样式(CPS)我可以避免使用堆栈[1],并且我可以将我的ant-assembly函数调用转换为普通JUMP(或GOTO).这正是我需要的,因为在ant-assembly中我根本没有堆栈,只有GOTO指令.

我的问题是,在一个ant-assembly函数完成之后,我无法告诉解释器(它解释了ant-assembly指令)在哪里继续.也许一个例子有帮助:

高级Clojure DSL:

(defn search-for-food [cont]
  (sense-food-here? ; a conditional w/ 2 branches
    (pickup-food ; true branch, food was found
      (go-home ; ***
        (drop-food
          (search-for-food cont))))
    (move ; false branch, continue searching
      (search-for-food cont))))

(defn run-away-from-enemy [cont]
  (sense-enemy-here? ; a conditional w/ 2 branches
    (go-home ; ***
      (call-help-from-others cont))
    (search-for-food cont)))

(defn go-home [cont]
  (turn-backwards
    ; don't bother that this "while" is …
Run Code Online (Sandbox Code Playgroud)

lisp scheme continuations clojure state-machine

6
推荐指数
2
解决办法
825
查看次数

Lodash中的partialRight似乎什么也没做

(我找不到开放的Lodash Slack 频道,这就是我在这里发帖的原因。)

你能告诉我为什么这个小提琴partialRight中的似乎什么也没做吗?该函数正确地重命名了所提供的键,但该函数(应该执行完全相同的操作)却没有。correctRenameKeysobjectwrongRenameKeys

请在浏览器中打开 JavaScript 控制台以查看运行 fiddle 时的日志。我在 Chrome 中测试了它。

    const renameKeysOfOneObject = (object, keyMappings) => {
      return _.reduce(object, function(result, value, key) {
        key = keyMappings[key] || key;
        result[key] = value;
        return result;
      }, {});
    };

    const correctRenameKeys = (objects, keyMappings) => {
        const keysRenamer = object => renameKeysOfOneObject(object, keyMappings);
        return _.map(objects, keysRenamer);
    };

    const wrongRenameKeys = (objects, keyMappings) => {
        const keysRenamer = _.partialRight(renameKeysOfOneObject, keyMappings);
        return _.map(objects, keysRenamer);
    };

    const …
Run Code Online (Sandbox Code Playgroud)

javascript lodash

4
推荐指数
1
解决办法
1490
查看次数