读取语句被跳过,未绑定变量

发布于 2024-09-29 05:05:09 字数 3322 浏览 0 评论 0原文

我仍在用 Common Lisp 开发我的猜数字游戏,并且已经陷入停滞状态。当调用以下代码时:

;;;; number-game.lisp
;;;;
;;;; Andrew Levenson
;;;; 10/25/2010
;;;;
;;;; Simple number guessing game. User has
;;;; five guesses to determine a number between
;;;; one and one hundred, inclusive (1-100).

;;; Set global variable for the target number:
(defparameter *target* nil) 

;;; Set the iterator so we may check the number of guesses
(defparameter *number-of-guesses* 0)

;;; Welcome the user
(defun welcome-user ()
 (format t "Welcome to the number guessing game!~%"))

;;; Prompt for a guess
(defun prompt-for-guess ()
 (format t "Please enter your guess (1-100): ")
 (finish-output nil) ; nil directs finish-output to standard IO
 (check-guess 'read-guess))

;;; Read in a guess
(defun read-guess ()
 (let (guess (read)))
 (if (numberp guess) ; If true, return guess. Else, call prompt-for-guess
  (progn
   (setq *number-of-guesses* (+ *number-of-guesses* 1))
   guess)
  (prompt-for-guess)))

;;; Check if the guess is higher than, lower than, or equal to, the target
(defun check-guess (fn)
 (setq guess (funcall fn))
 (if (equal guess *target*)
  (equal-to)
  (if (> guess *target*)
   (greater-than (guess))
   (if (< guess *target*)
    (less-than (guess))))))

;;; If the guess is equal to the target, the game is over
(defun equal-to ()
 (format t "Congratulations! You have guessed the target number, ~a!~%" *target*)
 (y-or-n-p "Play again? [y/n] "))

;;; If the guess is greater than the target, inform the player.
(defun greater-than (guess)
 (format t "Sorry, ~a is greater than the target.~%" guess)
 (if (< *number-of-guesses* 6)
  (prompt-for-guess)
  (game-over)))

;;; If the guess is less than the target, inform the player.
(defun less-than (guess)
 (format t "Sorry, ~a is less than the target.~%" guess)
 (if (< *number-of-guesses* 6)
  (prompt-for-guess)
  (game-over)))

;;; If the player has run out of guesses, give them the option
;;; of playing the game again.
(defun game-over ()
 (y-or-n-p "You have run out of guesses. Play again? [y/n] "))


;;; Play the game
(defun play ()
 ;; If it's their first time playing this session,
 ;; make sure to greet the user.
 (unless (> *number-of-guesses* 0)
  (welcome-user))
 ;; Reset their remaining guesses
 (setq *number-of-guesses* 0)
 ;; Set the target value
 (setq *target*
  ;; Random can return float values,
  ;; so we must round the result to get
  ;; an integer value.
  (round
   ;; Add one to the result, because
   ;; (random 100) yields a number between
   ;; 0 and 99, whereas we want a number
   ;; from 1 to 100 inclusive.
   (+ (random 100) 1)))
 (if (equal (prompt-for-guess) "y")
  (play)
  (quit)))

我收到错误

* (play)
Welcome to the number guessing game!
Please enter your guess (1-100): 
debugger invoked on a UNBOUND-VARIABLE in thread #<THREAD
                                                   "initial thread" RUNNING
                                                   {AA14959}>:
  The variable GUESS is unbound.

Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.

(READ-GUESS)

为什么它会跳过 read-guess 中的读取语句?我很确定该变量未绑定,因为它不允许我输入任何内容。

I'm still working on my number guessing game in Common Lisp, and I've reached a standstill. When the following code is invoked:

;;;; number-game.lisp
;;;;
;;;; Andrew Levenson
;;;; 10/25/2010
;;;;
;;;; Simple number guessing game. User has
;;;; five guesses to determine a number between
;;;; one and one hundred, inclusive (1-100).

;;; Set global variable for the target number:
(defparameter *target* nil) 

;;; Set the iterator so we may check the number of guesses
(defparameter *number-of-guesses* 0)

;;; Welcome the user
(defun welcome-user ()
 (format t "Welcome to the number guessing game!~%"))

;;; Prompt for a guess
(defun prompt-for-guess ()
 (format t "Please enter your guess (1-100): ")
 (finish-output nil) ; nil directs finish-output to standard IO
 (check-guess 'read-guess))

;;; Read in a guess
(defun read-guess ()
 (let (guess (read)))
 (if (numberp guess) ; If true, return guess. Else, call prompt-for-guess
  (progn
   (setq *number-of-guesses* (+ *number-of-guesses* 1))
   guess)
  (prompt-for-guess)))

;;; Check if the guess is higher than, lower than, or equal to, the target
(defun check-guess (fn)
 (setq guess (funcall fn))
 (if (equal guess *target*)
  (equal-to)
  (if (> guess *target*)
   (greater-than (guess))
   (if (< guess *target*)
    (less-than (guess))))))

;;; If the guess is equal to the target, the game is over
(defun equal-to ()
 (format t "Congratulations! You have guessed the target number, ~a!~%" *target*)
 (y-or-n-p "Play again? [y/n] "))

;;; If the guess is greater than the target, inform the player.
(defun greater-than (guess)
 (format t "Sorry, ~a is greater than the target.~%" guess)
 (if (< *number-of-guesses* 6)
  (prompt-for-guess)
  (game-over)))

;;; If the guess is less than the target, inform the player.
(defun less-than (guess)
 (format t "Sorry, ~a is less than the target.~%" guess)
 (if (< *number-of-guesses* 6)
  (prompt-for-guess)
  (game-over)))

;;; If the player has run out of guesses, give them the option
;;; of playing the game again.
(defun game-over ()
 (y-or-n-p "You have run out of guesses. Play again? [y/n] "))


;;; Play the game
(defun play ()
 ;; If it's their first time playing this session,
 ;; make sure to greet the user.
 (unless (> *number-of-guesses* 0)
  (welcome-user))
 ;; Reset their remaining guesses
 (setq *number-of-guesses* 0)
 ;; Set the target value
 (setq *target*
  ;; Random can return float values,
  ;; so we must round the result to get
  ;; an integer value.
  (round
   ;; Add one to the result, because
   ;; (random 100) yields a number between
   ;; 0 and 99, whereas we want a number
   ;; from 1 to 100 inclusive.
   (+ (random 100) 1)))
 (if (equal (prompt-for-guess) "y")
  (play)
  (quit)))

I get the error

* (play)
Welcome to the number guessing game!
Please enter your guess (1-100): 
debugger invoked on a UNBOUND-VARIABLE in thread #<THREAD
                                                   "initial thread" RUNNING
                                                   {AA14959}>:
  The variable GUESS is unbound.

Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.

(READ-GUESS)

Why is it skipping over the read statement in read-guess? I'm pretty sure the variable is unbound because it's not letting me enter anything in.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

揽月 2024-10-06 05:05:09

检查 LET 的语法。

例子:

(let ((variable (compute-some-value)))
   (do-something-with variable)
   (do-some-more))

Check the syntax of LET.

Example:

(let ((variable (compute-some-value)))
   (do-something-with variable)
   (do-some-more))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文