Search
Write a publication
Pull to refresh
14
0.1
Алексей Ткаченко @a-tk

Разработчик ПО

Send message

О, мания величия собственной персоной с двух ног ворвалась в чатик.

Я о ней и говорю.

Я про текст в статье.

Всё ещё нет

Кажется, одна ось с персистентной памятью уже была в истории.

Не везде исправили.

Перед iret не нужны ни popf (и pushf в прологе), ни sti.

Будем считать это корректным, но ad-hoc решением.

/* Берёт символ из буфера без блокировки. Возвращает -1 если пусто. */
char kbd_getchar(void)

Строго говоря, char не обязательно знаковый и -1 может не быть в диапазоне допустимых значений.

Кроме алфавита есть ещё раскладка, состояние shift и caps lock и ещё немножко всякое разное.

    sti                  ; разрешить прерывания
    popfd                ; восстановить EFLAGS
    iret                 ; возврат из прерывания

Эпилог обработчика прерывания немного избыточен и даже некорректен: во-первых, при входе в прерывание флаги уже на стеке, и ещё раз пушить их нет смысла. Во-вторых, команда iret обеспечивает атомарную операцию, в которой восстанавливаются флаги и осуществляется длинный переход на сохранённый адрес возврата.

У Вас же получается разрешение прерывания до выхода из обработчика, что приводит к тому, что другой обработчик может вытеснить выполнение сразу после инструкции sti. Далее, popf всё равно восстановит флаг прерываний, ранее сохранённый, поэтому операция sti перед popf тут избыточна.

// Exception с InnerException, и AggregateException с InnerExceptions есть из коробки

// по этому поводу допустим..
public class EInOutError : Exception
{
  public required int ErrorCode { get; init; }
}

try
{
  DoSomething();
}
catch (Exception ex) when (ex.HasErrorCode(200) is {} e)
{
  // Handle e
}

Для поддержки нужен один мелкий хелпер, который иерархию развернёт в плоскую коллекцию:

Текст хелпера
public static class ExceptionExtension
{
  public static EInOutError? HasErrorCode(this Exception e, int code)
  {
      return e.WithNested().OfType<EInOutError>().FirstOrDefault(x => x.ErrorCode == code);
  }
  
  public static IEnumerable<Exception> WithNested(this Exception e)
  {
    yield return e;
    
    if (e is AggregateException { InnerExceptions: { Count: > 0 } innerExceptions })
    {
      foreach (var x in innerExceptions)
      {
        yield return x;
      }
    }

    if (e.InnerException is { } inner)
    {
      yield return inner;
    }
  }
}

И совсем недалеко до switch expression осталось. А там, глядишь, и нормальный pattern matching завезут.

Развиваем идею:

v := if x <> nil then x.prop else nil;

Ждём оператор ?. следующие десять лет.

Да не надо ничего опровергать. Современное состояние физики указывает на то, что надо обобщение, но форма этого обобщения ещё не обнаружена (и не факт что будет обнаружена, хотя хотелось бы надеяться на позитивный исход). И мнение учёного, жившего в контексте науки середины прошлого века, погружённого в контекст тех времён, тоже нет смысла опровергать.

Или мю-мезон

Не опровержение, ведь КМ и ОТО являются частными случаями более общей теории, до которой физика ещё не добралась. Так же как теория тяготения Ньютона является предельным случаем ОТО для случая слабых полей и малых скоростей (что эквивалентно бесконечной скорости света в знаменателе). Отсюда и страх Ньютона о том, что он получил дальнодействующую теорию.

Экономика последних фантазий выглядит нереалистичной

Жёсткие - тоже. Но другие.

Скорее всего здесь было упрощение исходного компонента при портировании.

1
23 ...

Information

Rating
5,106-th
Location
Минск, Минская обл., Беларусь
Date of birth
Registered
Activity

Specialization

Software Developer, Software Architect
Lead
From 1,000,000 $
C#
.NET
C++
Git