M’de döngü yok, liste işlevi var
M’de for ya da while yoktur. Yerine dört kalıp kullanırsın:
| İş | İşlev | Örnek |
|---|---|---|
| Her öğeyi dönüştür | List.Transform | List.Transform({1, 2}, each _ * 2) |
| Süz | List.Select | List.Select(x, each _ > 0) |
| Tek değere indir | List.Accumulate | Bir toplam, birleşik metin, ardışık uygulama |
| Önceki değerden yenisini üret | List.Generate | Sayfalı API, ardışık tarihler |
List.Accumulate
Üç bağımsız değişken: liste, başlangıç durumu, (durum, öğe) => yeni durum. Durum yalnız sayı değildir: tablo olabilir. Bir sözlükteki tüm değişimleri sırayla bir sütuna uygulamak bunun klasik kullanımıdır.
let
Degisim = {{"ist", "İstanbul"}, {"ank", "Ankara"}},
Metin = "ist ve ank",
Sonuc = List.Accumulate(Degisim, Metin, (durum, d) => Text.Replace(durum, d{0}, d{1}))
in
Sonuc
List.Generate
Dört bağımsız değişken: başlangıç (fonksiyon), devam koşulu, sonraki değer, isteğe bağlı seçici. Hepsi fonksiyondur; ilki bile () => ister. Koşul hiç yanlış olmazsa sorgu bitmez: burada durdurulur, gerçek motorda takılır.
List.Generate(() => 1, each _ <= 100, each _ * 2)
List.Generate(
() => [Sayfa = 1, Toplam = 10],
each [Sayfa] <= 3,
each [Sayfa = [Sayfa] + 1, Toplam = [Toplam] + 10],
each [Toplam]
)
Metin
Text.Split liste döndürür, {0} ile parçaya erişilir. Text.BeforeDelimiter, Text.AfterDelimiter, Text.Start, Text.Middle, Text.Replace, Text.Contains en sık kullanılanlar. Büyük küçük harf için üçüncü bağımsız değişken: Comparer.OrdinalIgnoreCase. Türkçede Text.Upper(x, "tr-TR") kültürünü ver; yoksa sonuç bilgisayarın diline bağlıdır, İngilizce ortamda i harfi I olur.
let
Kod = "PTY-CM1090-LAX",
P = Text.Split(Kod, "-")
in
[Kalkis = P{0}, Sirket = Text.Start(P{1}, 2), Ucus = Text.End(P{1}, 4), Varis = P{2}]
Tarih
Tarih aritmetiği süre (duration) ile yapılır: #date(2024, 3, 1) - #date(2024, 2, 1) 29 günlük süre verir. Gün eklemek için Date.AddDays. Takvim tablosu üretmek klasik bir M işidir; rapor için bir kez kurulur.
let
Baslangic = #date(2024, 1, 1),
Gunler = List.Dates(Baslangic, 5, #duration(1, 0, 0, 0)),
T = Table.FromList(Gunler, Splitter.SplitByNothing(), {"Tarih"}),
Tipli = Table.TransformColumnTypes(T, {{"Tarih", type date}}),
Ay = Table.AddColumn(Tipli, "Ay Adı", each Date.MonthName([Tarih], "tr-TR"), type text)
in
Ay
List.Buffer
List.Buffer listeyi bellekte sabitler. Filtrede List.Contains her satır için listeyi yeniden üretiyorsa bir kez arabelleğe almak ciddi hız kazandırabilir. Sonucu değiştirmez, yalnız değerlendirme davranışını değiştirir; bu yüzden Lab’de fark görünmez.