Болталка PascalABC.NET

Да, спасибо. Так конечно писать нельзя. Не будем делать Cache для функций без параметров. Потому что изменятся a,b,c в основной программе - и всё - cache будет считать неверное значение

1 лайк

Интересное поведение. А с чем это связано? , если не секрет

Помогите перевести код с с# на pascalabc.net:

Код
foreach (var attachment in message.Attachments) {
    var fileName = attachment.ContentDisposition?.FileName ?? attachment.ContentType.Name;

    using (var stream = File.Create (fileName)) {
        if (attachment is MessagePart) {
            var rfc822 = (MessagePart) attachment;

            rfc822.Message.WriteTo (stream);
        } else {
            var part = (MimePart) attachment;

            part.Content.DecodeTo (stream);
        }
    }
}

Лайфхак - компилируешь и вызываешь из паскаля

а что если…

procedure x(a, b, c: integer);
begin end;

begin
  x(readlninteger3);
end.

Но думаете что создавать глобальное состояние - это решение по-лучше?

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

Тут почти все переводится строчка в строчку, хотя я вижу пару сложных моментов.
Нужен контекст этого кода + ваши попытки - чтоб я не всё за вас делал, а подсказывал.

зависит от контекста. понято, что глобальные переменные нужны в небольшом количестве, а иногда и вообще не нужны, но такие случаи всё же есть. мне это удобно, когда использую массивы списков при хранении большого кол-ва данных например.

это понятно. но в компиляторах я не шарю, оттуда и вопросы такие. были варианты, что результат достигается каким ни будь флагом например, но видимо не тот уровень абстракции

Если у вас появляются массивы массивов и т.п. - обычно это кривая архитектура, надо использовать больше пользовательских типов.

К примеру, объявить внутренний массив (в вашем случае список) пользовательским типом, и инкапсулировать все операции с ним.

может быть, но это не всегда имеет смысл. имхо, это может как упростить архитектуру, так и осложнить в зависимости от ситуации

забавно, что стремление к совместимости может создать мину в коде. описание где то и в правду не помешало бы

В свое время меня это тоже “забавляло”. Потом привык…

Да лучше разработали бы все компактно, и не было такие проблемы. Но думаю разработчики примут это в будущем.

“Все компактно” - это уже было. У Н.Вирта. Вот только как раз по этой причине и умерло.

А? А что, а почему, а как?

Вам как, всю историю языка Паскаль за 50 лет изложить? Или все же сами в Интернет поищете?

Если вы считаете что-то важным рассказать - милости прошу, ни буковки мимо глаз не пропущу Если же нет - ну, нет так нет. Не настолько важная информация, чтобы её искать

Верно. Не настолько важная. Но тогда не пытайтесь тут устроить филиал “Что? Где? Когда?”. Не получится.

А вот интересно, если так нужно было делать такой компилятор, то почему именно паскаля?

Давно уже, задолго до PascalABC был разработан более прогрессивный язык Modula-2 с улучшенным по сравнению с паскалем синтаксисом и большими возможностями. Можно было бы сделать на её основе систему, а не на Паскале. Дальше ещё были Modula-3, Oberon и тд, но там уже не так много было улучшено.

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