Tại sao Raku mặc định if / while / loop / khi tất cả các khối có cùng giá trị nhận dạng (.WHICH)?


9

Ngoại trừ khối nơi tôi đã khai báo chữ ký, tất cả các khối có cùng giá trị nhận dạng và tuyên bố sẽ được khai báo trên dòng 1 bất kể chúng xuất hiện ở đâu. Bất cứ ai có thể làm sáng tỏ tại sao đây là trường hợp?

say 「Let's look at some blocks…」;

if True {
  &?BLOCK.say;
}

while True {
  &?BLOCK.say;
  last;
}

loop {
  &?BLOCK.say;
  last;
}

if True -> | {
  「I'm different!」.say;
  &?BLOCK.say;
}

when ?True {
  &?BLOCK.say;
}

Câu trả lời:


6

Trước hết: .saykhông KHÔNG cung cấp cho bạn những giá trị bản sắc, bởi vì đó gọi là .gistphương pháp trên biểu thức nhất định. Đối với giá trị danh tính, bạn cần gọi .WHICHphương thức. May mắn thay, Block.gistphương thức này bao gồm giá trị nhận dạng trong chuỗi của nó. Nhưng điều đó không được đảm bảo là trường hợp cho tất cả các đối tượng.

Những gì bạn thấy ở đó, là trình tối ưu hóa tĩnh tại nơi làm việc: bởi vì không có gì xảy ra bên trong khối, nó có thể bị loại bỏ. Trong một trường hợp nó là khác nhau (nơi mà bạn chỉ định một chữ ký khác), nó khác nhau. Nếu bạn chạy tập lệnh này bằng --optimize=0hoặc --optimize=1, thì tất cả các khối sẽ có các giá trị nhận dạng khác nhau.

Tôi đoán bạn có thể gọi nó là một vấn đề mà việc đề cập &?BLOCKkhông ngăn cản trình tối ưu hóa tĩnh làm phẳng phạm vi. Mặt khác, bạn cũng có thể gọi đây là trường hợp DIHWIDT (Bác sĩ, thật đau lòng khi tôi làm điều này). Vì vậy, đừng làm điều đó sau đó :-)

CẬP NHẬT: chính chữ ký khác nhau đã tạo ra sự khác biệt. Daniel Mita ++


2
Cảm ơn thông tin, mặc dù tôi không chắc là tôi theo dõi đoạn 2. Việc tạo ra chuỗi không phải là điều tạo ra sự khác biệt, đó là chữ ký cho khối đó (nó có cùng giá trị nhận dạng nếu tôi xóa chữ ký nhưng vẫn giữ chuỗi).
Daniel Mita
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.