Yuvalanmış Listeler Haritası
Diyelim ki matris gibi iç içe geçmiş bir listeniz var:
[[0 1 2][3 4 5][6 7 8]]
Veya bir dizi dizgi:
["foo""bar"]
Ve bir bloğu iç içe seviyeye eşlemek istiyorsunuz (yani her bir sayıya veya her karaktere uygulayın). Saf çözüm bir iç içe %
:
{{...}%}%
Bununla birlikte, aslında iç bloğu yığının üzerine itebilir ve sonra kullanabilirsiniz f%
. f
"ek parametreli harita" dır, bu nedenle %
ikinci parametre olarak bloğu kullanarak dış listeye eşlenir:
{...}f%
İki bayt kaydeder.
Başka temiz hile böyle bir şey yapmak for (i=0; i<5; ++i) for (j=0; j<5; ++j) {...}
DİR
5,_f{f{...}}
Dış f
, ikinci menzile ek bir parametre olarak beslenerek birinci menzile eşlenir. Fakat şimdi, f
tekrar kullanırsanız , sadece üst yığın elemanı bir dizidir, böylece f
dış bloğu "yineleme değişkeni" ek bir parametre olarak sağlayarak iç bloğu eşlersiniz. Bu, iç bloğun istif ile birlikte i
ve j
üzerinde çalıştığı anlamına gelir .
Bu, sadece bir bloğun Kartezyen ürün üzerine eşlenmesiyle aynı sayıda karaktere sahiptir (her ne kadar diziler olarak çiftlere ihtiyacınız olursa kısalır):
5,_m*{~...}%
Aradaki fark, bu sürümün tüm çiftler için tek bir sonuç dizisi oluşturmasıdır; oysa, çiftleyiciler f
, sonuçları yineleyici değişkenleri koordinatlar olacak şekilde bir ızgarada saklamak için faydalı olabilecek, iç içe geçmiş bir liste sunar.
Bu numarayı bana gösterdiği için Dennis'e teşekkür ederim.
0.6.4 Güncellemesi
f
ve :
şimdi kendileri de dahil olmak üzere başka bir operatörü alarak son derece geliştirildi. Bu, şimdi daha da fazla bayt kaydedebileceğiniz anlamına gelir. Bir işlecin yuvalanmış bir listeyle eşlenmesi şimdi daha da kısaldı:
{:x}%
{x}f%
::x
Bu gerçekten de iç içe listelerde blokları eşleme ile yardımcı olmuyor.
Kartezyen ürüne uygulama blokları veya operatörleri gelince, bu işlem şimdi blokların yanı sıra operatörler için de kısalmıştır:
5,_f{f{...}}
5,_ff{...}
5,_f{fx}
5,_ffx
Güzel olan şimdi bunları yuvalayabilmeniz. Böylece bir işletmeciyi listedeki üçüncü seviyeye kolayca uygulayabilirsiniz:
:::x
Ya da aldatmaca içeren bir blok:
{...}ff%