2011-06-22 89 views
6

Tôi đã xem xét/ngớ ngẩn/dễ thương/rực rỡ "sleep sort" that seems to have originated over at 4chan. Để sắp xếp một mảng ints, ý tưởng là khoảngCâu hỏi về toán tử Perl6

  
    foreach elt in @array 
     spawn thread(elt) 

nơi ren (n) không

 
    sleep n 
    print n 

nên các giá trị nhỏ hơn được in trước đó.

Có một thực hiện Perl6

 
@foo = @foo>>.&sleep; 

Tôi nhận được rằng >> 'hypers' các nhà điều hành, và rằng điều này giả định hypering được tự động song song. Nhưng .& làm tôi bối rối.

Có ai có thể giải thích điều này không?

nhờ

Trả lời

8

Nếu bạn có một hàm yourfunc, sau đó bạn có thể lấy một tham chiếu đến nó bằng ký hiệu, &yourfunc. Cú pháp $obj.$function chỉ cần gọi $function với một đối số, $obj. Vì vậy, người ta cũng có thể viết $function($obj) - ngoại trừ cú pháp này không cho phép sử dụng siêu dữ liệu.

Nhưng bất cứ ai đến với điều này "thực hiện" là sai về ba tài khoản:

  • Các nhà điều hành siêu cho phép trình biên dịch để đẻ trứng một số chủ đề để thực hiện mỗi phương pháp, nó không có để đẻ trứng một thread cho tất cả chúng cùng một lúc - do đó, "sắp xếp ngẫu nhiên" không thể hoạt động
  • Toán tử siêu có thể ngẫu nhiên thứ tự thực hiện các phương thức, nhưng nó phải giữ lại thứ tự hoặc các mục trả về - vì vậy @foo sẽ không được sắp xếp ở tất cả, ngay cả khi điểm đầu tiên không được áp dụng.
  • sleep() được cho là trả về số giây ngủ, không phải là đối số. Nếu ai đó đặt máy tính ngủ trong khi tính toán, kết quả có thể là số cao hơn nhiều.
+0

Cảm ơn câu trả lời, moritz. Hai lần theo dõi: Đầu tiên, bạn có cần & lấy một tham chiếu (tôi nghĩ trong C, tên của hàm luôn trả về một tham chiếu/con trỏ ngay cả khi không có &). Và tôi đã nghĩ '.' là "phương thức gọi", nghĩa là tìm kiếm cây thừa kế cho phương thức lớp thích hợp. Việc sử dụng bạn mô tả một số phiên bản biến đổi/mặc định của 'phương pháp gọi', hoặc cái gì khác hoàn toàn? – jonathan

+0

Vâng, Perl 6 không phải C. Nếu bạn đề cập đến một chương trình con không có dấu và, bạn gọi nó. – moritz

+0

Trả lời câu hỏi thứ hai của bạn: '$ obj.method' thực sự là một cuộc gọi phương thức, nhưng' $ obj. $ Coderef' thì không. – moritz