challenge 出力の一時停止と再開

起動すると、標準出力に1秒毎に'a'の1文字を出力し続けるプログラムで、 以下の条件を満たすものを「どう書く?」

  • 'q'キーが押されるとプログラムは終了する
  • 出力中に'p'キーが押されると一時停止する
  • 一時停止中に'p'キーが押されると出力を再開する

Posted feedbacks - Common Lisp

sbcl依存のthreadパッケージを利用しています。一つわからない
ことがあって、それはdefpackage - in-packageの流れでパッケー
ジ化すると、うまく動かないところです。

thread programmingははじめてなので、変数の取り扱いの
注意点が抜けてるみたいです。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
(defun print-a ()
  (format *standard-output* "a")
  (finish-output)
  (sleep 1))

(defmacro read-thread(res)
  `(sb-thread:make-thread
    (lambda()(setf ,res (read *standard-input*)))))

(defun main ()
  (let* ((res nil)
     (stop nil)
     (thread (read-thread res)))
    (loop do
     (if (null (sb-thread:thread-alive-p thread))
         (case res
           ((q)
        (return))
           ((p)
        (and stop (print-a))
        (setf stop (not stop)
              thread (read-thread res)))
           (otherwise
        (unless stop (print-a))
        (setf thread (read-thread res))))
         (unless stop (print-a))))))

Index

Feed

Other

Link

Pathtraq

loading...