2008-12-23 27 views
13

Trong khi dabbling trong Clojure tôi đã viết một chương trình rất cơ bản để echo bất cứ điều gì người dùng gõ vào nó. Tuy nhiên, nó không chạy theo cách mà tôi cảm thấy là tự nhiên. Dưới đây là các mã:Clojure - Phản ứng phụ xảy ra ngoài trật tự

(defn goo [] 
    (print "echo> ") 
    (def resp (read-line)) 
    (print resp) 
) 

tôi mong chờ các mã để chạy như thế này (đối với tôi gõ vào foo như đầu vào read-line):

user=> (goo) 
echo> foo 
foonil 

Nhưng thay vào đó, tiếng vang và read-line là đã chuyển đổi:

user=> (goo) 
foo 
echo> foonil 

Tại sao điều này xảy ra? Có một sự tinh tế tôi đang thiếu?

EDIT: Từ câu trả lời của Joe, giải pháp đúng được cập nhật là:

(defn goo [] 
    (print "echo> ") 
    (flush) 
    (def resp (read-line)) 
    (print resp) 
    (flush) 
) 

Ngoài ra, bừng là không cần thiết nếu bạn sử dụng println thay vì print.

Trả lời

17

Tôi không biết gì về clojure nhưng điều này nghe giống như trường hợp bộ đệm không bị đỏ mặt. Tìm hiểu cách loại bỏ tiêu chuẩn ra sau khi in. Chức năng println có thể tuôn ra ở cuối mỗi dòng. Hãy thử:

(defn goo [] 
    (print "echo> ") 
    (flush) 
    (def resp (read-line)) 
    (print resp) 
) 
+0

Điều đó đã làm nó! Thêm (tuôn ra) sau khi các bản in nhận được nó. Cảm ơn đã phản ứng nhanh chóng! –

+2

Tuyệt. Bây giờ tôi có một câu trả lời đã được kiểm tra bằng một ngôn ngữ mà tôi không biết. :-) Mừng vì tôi có thể giúp. – jmucchiello

+0

kỹ năng tốt! Trong sự tò mò từ một người biết Clojure nhưng không phải là hoạt động bên trong của bộ đệm stdout ... tại sao vấn đề này xảy ra ở tất cả? Có vẻ lạ khi đặt hàng có thể thay đổi trong bộ đệm ..... – mikera

13

Ngoài ra, vui lòng không sử dụng "def" trừ khi bạn thực sự thực sự muốn xác định biến toàn cầu. Sử dụng "để" thay vì:

(defn goo [] 
    (print "echo> ") 
    (flush) 
    (let [resp (read-line)] 
    (print resp) 
    (flush))) 

hay, ngắn hơn

(defn goo [] 
    (print "echo> ") 
    (flush) 
    (print (read-line)) 
    (flush)) 
Các vấn đề liên quan