Comment detail

出力の一時停止と再開 (Nested Flatten)
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))))))
threadを扱うときに変数の入り方がわかりにくかったですね。

q<return>すると resの中には'common-lisp-user::q と入力さ
れていました。こんなことあるんですね。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
0a1,4
> (defpackage :dokaku179
>   (:use :common-lisp :sb-thread))
> (in-package :dokaku179)
> 
8c12,14
<     (lambda()(setf ,res (read *standard-input*)))))
---
>     (lambda()(progn
>            (in-package :dokaku179)
>            (setf ,res (read *standard-input*))))))

Index

Feed

Other

Link

Pathtraq

loading...