【问题标题】:How to use do in lisp?如何在 lisp 中使用 do?
【发布时间】:2015-05-13 19:39:11
【问题描述】:

我要做的是编写一个函数,该函数将在井字游戏结束后重新开始。 应该发生的是,将询问玩家是否想玩另一场比赛。如果他们这样做了,那么他们会单击“是”并调用一个函数来重新开始游戏。如果他们选择否,则程序终止。 这是我到目前为止所拥有的......

(defun play-again ()
  (do (y-or-n-p "Would you like to play again? ")
      ((play-one-game) nil)))

play-one-game 是当用户从提示中单击“yes”时我想要运行的功能。否则游戏终止,因为没有调用其他函数。顺便说一句,以防万一你需要知道,我正在使用 Allegro。

【问题讨论】:

  • 你检查过the documentation吗?
  • 您的代码有什么问题?你有错误吗?它是否运行,但没有按照您的预期运行?您对DO规范的哪一部分有疑问?

标签: function lisp common-lisp


【解决方案1】:

如果您不理解 CL 中的表格,您应该阅读 CLHS (http://www.lispworks.com/documentation/lw60/CLHS/Body/m_do_do.htm)

这里使用do的解决方案: (defun play-again () (do ((again t (y-or-n-p "Would you like to play again?"))) ((不再)无) (玩一个游戏)))

(这个函数第一次调用play-one-game没有问题)

【讨论】:

    【解决方案2】:

    假设您的y-or-n-p nil 只有当用户按下 n 时,您才能将主循环编写为

    (defun main ()
      (loop :while (y-or-n-p "Would you like to play again? ")
            :do (play-one-game)))
    

    或者在我将重命名 play 的 play-one-game 结束时,提示用户,如果他想再次玩,只需再调用一次 play。

    (defun play-one-game ()
      ....
      (when (y-or-n-p "Would you like to play again? ")
        (play-one-game)))
    

    【讨论】:

    • 最后一个在某些实现中最终会爆栈。
    • 虽然大多数常见的 Lisp 实现都具有 TCO,但 Allegro 确实做到了:0branch.com/notes/tco-cl.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多