Mengapa Raku default jika / while / loop / ketika blok semua memiliki nilai identitas yang sama (.WHICH)?

9

Kecuali untuk blok tempat saya mendeklarasikan tanda tangan, semua blok memiliki nilai identitas yang sama, dan klaim untuk dideklarasikan pada baris 1 di mana pun itu terjadi. Adakah yang bisa menjelaskan mengapa ini terjadi?

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;
}
Daniel Mita
sumber

Jawaban:

6

Pertama-tama: .sayapakah tidak memberikan nilai identitas, karena yang memanggil .gistmetode pada ekspresi yang diberikan. Untuk nilai identitas, Anda perlu memanggil .WHICHmetode tersebut. Untungnya, Block.gistmetode ini tidak memasukkan nilai identitas dalam pengetatannya. Tapi itu tidak dijamin untuk semua objek.

Apa yang Anda lihat di sana, adalah pengoptimal statis di tempat kerja: karena tidak ada yang terjadi di dalam blok, itu dapat dibuang. Dalam satu kasus di mana hal ini berbeda (di mana Anda tentukan tanda tangan alternatif), itu adalah berbeda. Jika Anda menjalankan skrip ini dengan --optimize=0atau --optimize=1, maka semua blok akan memiliki nilai identitas yang berbeda.

Saya kira Anda bisa menyebutnya masalah yang menyebutkan &?BLOCKtidak menghambat pengoptimal statis dari meratakan cakupan. Di sisi lain, Anda juga bisa menyebutnya sebagai kasus DIHWIDT (Dokter, Rasanya Sakit Ketika Saya Melakukan Ini). Jadi jangan lakukan itu :-)

UPDATE: itu adalah tanda tangan berbeda yang membuat perbedaan. Daniel Mita ++

Elizabeth Mattijsen
sumber
2
Terima kasih atas informasinya, meskipun saya tidak yakin saya mengikuti paragraf ke-2. Penciptaan string bukanlah yang membuat perbedaan, itu adalah tanda tangan untuk blok yang membuatnya (memiliki nilai identitas yang sama jika saya menghapus tanda tangan tetapi menyimpan string).
Daniel Mita