Neden / while / loop / when bloklarının tümü aynı kimlik değerine (.WHICH) sahipse varsayılan Raku?


9

İmza beyan ettiğim blok dışında, tüm bloklar aynı kimlik değerine sahiptir ve nerede olurlarsa olsunlar, 1. satırda beyan edildiklerini iddia ederler. Biri bunun neden böyle olduğuna ışık tutabilir mi?

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;
}

Yanıtlar:


6

Her şeyden önce: .sayyok DEĞİL aramaları, çünkü size kimlik değer vermek .gistverilen ifadeye yöntemi. Kimlik değeri için .WHICHyöntemi çağırmanız gerekir . Neyse ki, Block.gistyöntem yapar kendi stringification kimlik değerini içerir. Ancak tüm nesneler için durum böyle değildir .

Orada gördüğünüz, işte statik optimize edici: çünkü blok içinde hiçbir şey olmuyor, atılabilir. O farklı bir durumda (eğer alternatif bir imza belirtilen yerde), bu ise farklı. Eğer bu komut dosyasını çalıştırırsanız --optimize=0veya --optimize=1daha sonra tüm bloklar olacak farklı kimlik değerleri vardır.

Bahsetmenin &?BLOCKstatik optimizer'ın kapsamı düzleştirmesini engellemediği bir sorun diyebilirsiniz . Öte yandan, buna DIHWIDT (Doktor, Bunu Yaptığımda Acıyor) vakası da diyebilirsiniz. O zaman yapma o zaman :-)

GÜNCELLEME: Farkı yaratan farklı imzadır. Daniel Mita ++


2
2. paragraf için takip ettiğimden emin olmasam da bilgi için teşekkürler. Dizgenin oluşturulması fark yaratan şey değildir, yapan bloğun imzasıdır (imzayı kaldırır, ancak dizeyi tutarsam aynı kimlik değerine sahiptir).
Daniel Mita
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.