2017-01-18 11 views
1

私が取り組んでいる少しの試合では、プレイヤーの名前を読みたいと思います。私はこれまでに2つの解決策を持っていますが、どちらも少し面倒です。バージョン1つの軍に加えて、彼/彼女はより多くのプレーヤーを追加したいと述べるユーザー:ユーザーからのループ内でのデータの読み込み

(defun read-player() 
    (loop :while (y-or-n-p "Add another player?") 
     :do (format t "~& Name of player #~D: " (1+ (length players))) 
     :collect (read-line) :into players 
     :finally (print players))) 

バージョン2 format表現の重複を必要とします:

(defun read-player2() 
    (let ((players '())) 
    (format t "~& Name of player #~D: " (1+ (length players))) 
    (loop :for player = (read-line) 
      :until (string= player "") 
      :collect player :into players 
      :do (format t "~& Name of player #~D: " (1+ (length players))) 
      :finally (print players)))) 

は私の2つのアプローチの合成があります?追加の質問と繰り返しコードをユーザーに迷惑をかけることはありませんか?

答えて

4

プレーヤーを読むときにprognを使用することはどうですか?

(defun read-players() 
    (loop :for player-count :upfrom 1 
    :for player = 
    (progn 
     (format t "~& Name of player #~D (RET to stop): " player-count) 
     (finish-output) 
     (read-line)) 
    :while (plusp (length player)) 
    :collect player)) 
> (read-players) 
Name of player #1 (RET to stop): r 
Name of player #2 (RET to stop): g 
Name of player #3 (RET to stop): 
==> ("r" "g") 

PS。

(defun read-players() 
    (loop :for player-count :upfrom 1 
    :for player = (ask-user "Name of player #~D (RET to stop)" player-count) 
    :while (plusp (length player)) 
    :collect player)) 
+0

パーフェクト:あなたのread-playersも、より読みになるだろう、

(defun ask-user (format-string &rest format-arguments) (format t "~&~?: " format-string format-arguments) (finish-output) (read-line)) 

あなたがformat魔法が好きであれば、

(defun ask-user (format-string &rest format-arguments) (fresh-line) (apply #'format t format-string format-arguments) (finish-output) (read-line)) 

のような機能を追加したりすることは比較的一般的です!それは私が逃したものです。 –

+1

'READ-LINE'の前に' FINISH-OUTPUT'を置いてください。また、 '' APPLY''の代わりに ''〜? ''を' 'ASK-USER''で使うこともできます。それでは、新鮮/コロン/等を入れましょう。そこ。 – jkiiski

+0

@jkiiski:ご意見ありがとうございます – sds

関連する問題