Thread overview
Aralık Döndüren Takvim Uygulaması
Jan 12, 2023
Salih Dincer
Jan 12, 2023
Salih Dincer
Jan 12, 2023
Ali Çehreli
Jan 13, 2023
Salih Dincer
January 12, 2023

Merhaba,

Bu hafta çok şey öğrendim. İlk defa iç içe (Range'e dikkat!) sınıf yapısı kullandım. Yeni yılın şerefine olsun 😀

void main()
{
  import std.stdio, std.string : cp = capitalize;
  import std.range, std.conv : to;

  with(new MyCalendar(2023, 12))
  {
    const title = dowToStr!2;
    foreach(month; range.take(6))
    {
      const mName = date.month.to!string;
      year.write(" ");           // current year
      mName.cp.writefln!"%s:";   // name of the month
      title.writefln!"%-(%s %)"; // days of week
      month.writeln;             // formatted days
    }
  }
}
class MyCalendar
{
  import std.array, std.datetime, std.conv : to;
  import std.string : capitalize;

  Range range;
  Date date;
  int year, month;

  this(int year, int month)
  {
    this.month = month;
    this.year = year;
    this.date = Date(year, month, 1);
    this.range = new Range();
  }

  class Range
  {
    enum empty = false;

    string front()
    {
      import std.format : fw = formattedWrite;
      auto res = appender!string;
      int day, dow = date.dayOfWeek;
      res.fw("%s", replicate(" ", dow * 3)); // skip days

      for(day = 1; day <= date.daysInMonth; ++day)
      {
        if(++dow % 7) res.fw("%2s ", day);
        else res.fw("%2s\n", day);
      }
      if(dow % 7) res.put("\n");
      return res.data;
    }

    void popFront()
    {
      month++;
      if(month > 12)
      {
        ++year;
        month = 1;
      }
      date = Date(year, month, 1);
    }
  }

  auto dowToStr(size_t len = 0)()
  {
    alias E = DayOfWeek;
    string[] result;
    for(E x = E.min; x <= E.max; x++)
    {
      result ~= len ? x.to!string[0..len]
                    : x.to!string;
    }
    return result;
  }
}

Başarılar...

January 12, 2023

On Thursday, 12 January 2023 at 19:12:56 UTC, Salih Dincer wrote:

>

Yeni yılın şerefine olsun 😀

Çıktısını unutmuşum, bu senenin son ayından 31 mayıs 2024'e kadar tüm günler. Tabi yabancı formatta, bunun Türkçesi size kalmış...

/*
2023 Dec:
su mo tu we th fr sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

2024 Jan:
su mo tu we th fr sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

2024 Feb:
su mo tu we th fr sa
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29

2024 Mar:
su mo tu we th fr sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

2024 Apr:
su mo tu we th fr sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

2024 May:
su mo tu we th fr sa
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
*/
January 12, 2023
On 1/12/23 11:12, Salih Dincer wrote:

> Bu hafta çok şey öğrendim. İlk defa iç içe (Range'e dikkat!) sınıf
> yapısı kullandım.

Güzel! :)

Phobos bu gibi işlerde serbest işlev içinde tanımlanmış olan yapı nesnesi döndürüyor. Örneğin, şöyle yapabilirdi:

auto myCalendar(int year, int month) {
    // Senin class'ın üyeleri burada...

    struct Range {
        // Bu yapı myCalendar'daki değişkenleri
        // ve işlev parametrelerini kullanabilir.
        // ...
    }

    return Range();
}

Yukarıdaki yöntem, o işlevin kapsamını (context) dinamik olarak ayırır ve gerektiği kadar canlı tutar. Aslında sen de aynı şeyi yapıyorsun ama sendeki kapsam, 'new' ile açıkça oluşturulan nesnenin üyeleri oluyor.

Ali

January 13, 2023

On Thursday, 12 January 2023 at 21:59:19 UTC, Ali Çehreli wrote:

>

Phobos bu gibi işlerde serbest işlev içinde tanımlanmış olan yapı nesnesi döndürüyor. Örneğin, şöyle yapabilirdi:

Date nesnesiyle enumToStr() işlevini dışarı alınca dediğiniz mümkün. Ama tam 15 satır kısaltmak uğruna, sanatsal (with ile kurulan) yapısını feda etmek anlamına geldiği için çekinceliydim. Yine de az önce struct'lı sürümünü de yaptım...

Bu sayede add veya roll!"months" şablonlarını kullanmayı öğrendim. Artık popFront() daha kısa:

import std.array, std.datetime.date;
import std.stdio, std.string : cp = capitalize;
import std.range, std.conv   : to;
import std.format            : fw = formattedWrite;

void main()
{
  auto date = Date(2023, 12, 1);
  auto range = MyCalendar(date);
  {
    const title = enumToStr!DayOfWeek(2);
    foreach(month; range.take(6))
    {
      const mName = date.month.to!string;
      date.year.write(" ");      // current year
      mName.cp.writefln!"%s:";   // name of the month
      title.writefln!"%-(%s %)"; // days of week
      month.writeln;             // formatted days
    }
  }
}

struct MyCalendar
{
  Date date;
  enum empty = false;

  string front()
  {
    auto res = appender!string;
    int day, dow = date.dayOfWeek;
    res.fw("%s", " ".replicate(dow * 3)); // skip days

    for(day = 1; day <= date.daysInMonth; ++day)
    {
      if(++dow % 7) res.fw("%2s ", day);
      else res.fw("%2s\n", day);
    }
    if(dow % 7) res.put("\n");
    return res.data;
  }

  void popFront()
  {
    date.roll!"months"(1);
  }
}

auto enumToStr(E)(size_t len = 0)
{
  string[] result;
  for(E x = E.min; x <= E.max; x++)
  {
    result ~= len ? x.to!string[0..len]
                  : x.to!string;
  }
  return result;
}

Teşekkürler...