Болталка PascalABC.NET

Последние пару месяцев я занимаюсь тем, что никто, как я думаю, еще пока не сделал - пытаюсь написать книгу, в которой будет описание РаsсаlАВС.NЕТ, пусть поверхностное, но все же достаточно полное, а также руководство для начинающих по этой системе программирования.

Попытка описать язык, пока что частичная - я не дошел и до середины - позволила уже сейчас взглянуть на РаsсаlАВС.NЕТ в целом и понять, насколько он стал “раздутым” в сравнении с другими языками. Оставив в основе “унаследованный от предков” Паскаль, неся в себе груз частичной совместимости с Delphi и Free Pascal, прихватив “все лучшее” из Python, Haskell, C# и т.д, щедро сдобренный синтаксическим сахаром, язык стал просто огромен. Да, писать на нем быстро и комфортно, каждый может взять из него некоторое подмножество и работать с ним. Получилось как бы много языков в одном.

Причем, продолжает получаться. У языка нет жесткой спецификации и это делает проблематичной попытку его даже просто описать. Сегодня в языке чего-то нет, а завтра оно оно уже есть. Бывает и наоборот, вот оно было - и нет. Это неплохо, что язык совершенствуется, я повторюсь: это делает затруднительным его описание. Иногда мне кажется, что разработчики уже сами начали прогибаться под объемом языка. А чем иначе объяснить ситуацию, когда одно и то же делается двумя или даже тремя разными способами? Когда одно и то же дают вызов статического метода класса, функция и расширение? Я могу понять, что это просто так получилось, но это же утраивает описание! Не всегда получается написать об этих, таких разных средствах в одном месте пособия для начинающих.

В языке есть конструкции, которые я пока что даже объяснить не могу. Возможно, они пришли из каких-то глубин С++/С# (более того, продолжают приходить, если их вовремя не отфутболивают разработчики). Тем более, я не могу объяснить потенциальному читателю, зачем нужны эти конструкции, почему он должен тратить время на знакомство с ними и их осмысление. Ощущение, что введено “на всякий случай, а вдруг кому-то понадобится?”.

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

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

P.S. А если коротко, Хотите оценить язык - попробуйте сделать его описание.

1 лайк

Сама идея написать книгу по языку - мне нравится. Но, хотелось бы заметить, что есть трудные для описания места языка, к примеру, автовывод типов. Пока мы от @Admin не добьемся чётких правил по поводу когда явно указывать тип, а когда нет, не думаю, что стоит что-то в этом плане утверждать. Разработчик лучше знает что и как в языке. Остается лишь это узнать нам.

Не исключаю, что займусь разработкой своего Паскаля.

А, где указывать тип - это проще. Для переменных с автовыводом типов если это лямбда с неявными типами, то обязательно. и если nil то обязательно. В остальных случаях автовыводится.

упомянающие->упоминающие

Я думал это у меня с грамматикой плохо не_программерских языков плохо))) Ну за вас же компьютер может исправить.

А можете сразу ссылки в каждом пункте делать. К примеру в первом пункте превратить “целый раздел” в ссылку на него. Так будет удобнее.

Он и исправил. Спасибо за замечание.

Смотря как.

Если как некоторые люди на форуме, то нет. Если конструктивные - то да.

Мне @Admin сказал сделать такой топик. Думаю, обсуждать эти ресурсы тут не надо.

Я всего лишь хотел знать назначение. Понял, не обсуждаем. Просто список. В конце-концов, ответ от модератора не оставляет вариантов.

2 лайка

Тогда давайте обсудим (то есть спросим у @Admin) - а в чём вообще смысл этого топика (особенно если он не закреплён в разделе #pascalabcnet).

1 лайк

Сергей, я сейчас не могу привести тему в порядок, так как работаю с телефона. К вечеру всё приведу в божеский вид.

да ушь знаю, смысл то тогда в перегрузке если компилятор не может отличить функцию по выходным параметрам… Предположим у меня функция конвертации чисел, я хочу чтоб она использовала одну конструкцию для разных типов на выходе, к примеру SToR(s:string):Biginteger; SToR(s:string):Integer; SToR(s:string):Real; SToR(s:string):Cardinal; и тд КАК БЫТЬ?

Конвертации это operator implicit и operator explicit:

type
  t1=class
    i:integer;
    
    constructor(i:integer) :=
    self.i := i;
    
    class function operator implicit(i:integer):t1 := new t1(i);
    class function operator implicit(a:t1):integer := a.i;
  end;

begin
  var i:integer := 5;
  var a:t1;
  
  a := i;//тут неявно преобразовывает
  i := a;
  
  a := t1(i);     //тут явно преобразовывает
  i := integer(a);
end.
type
  t1=class
    i:integer;
    
    constructor(i:integer) :=
    self.i := i;
    
    class function operator explicit(i:integer):t1 := new t1(i);
    class function operator explicit(a:t1):integer := a.i;
  end;

begin
  var i:integer := 5;
  var a:t1;
  
  //a := i;//тут неявно преобразовывает
  //i := a;//не сработает, потому что explicit переводится "явно"
  
  a := t1(i);     //тут явно преобразовывает
  i := integer(a);
end.

Их можно делать экстеншн методами:

function operator explicit(self:integer):string; extensionmethod := self.ToString;
function operator explicit(self:string):integer; extensionmethod := StrToInt(self);

begin
  var i:integer := 5;
  var s:string;
  
  s := string(i);
  i := integer(s);
end.

Ну и, конечно, никто не мешает делать разные названия (SToBInt,SToInt и т.п.).

Проблема одинаковых названий - в том что компилятору придётся магическим образом угадывать какой тип вы ходите. Вот смотрите:

var i := SToR('1234');

Какой тип должен быть у i? Можно его, конечно, задать явно, но в таком случае выбор перегрузки будет зависеть от контекста вне функции (вне её параметров), что порождает кучу ошибок компилятора и помогает программисту делать глупые ошибки.

И, в конце концов, если вам не важна производительность - можете сделать SToR шаблонной, и тогда писать SToR&<BigInteger>, чтоб выбрать перегрузку для BigInteger. Производительность будет ниже потому - что придётся выбирать тип в процессе выполнения а не компиляции.

var i := SToR(‘1234’); в этом примере с не явным указанием типа переменной (var i ) тип берется по умолчанию, следовательно никакой магии. это же все так примитивно, зачем усложнять …чем меньше заморачиваешься на мелочах, тех больше концентрируешься на алгоритме основной программы, подставил функцию для конвертации и смотришь в смысл программы, а не заморачиваешься на отдельных нюансах которые захламляют код программы. Мне С++ не нравится только их за скобок в место begin end не как не могу привыкнуть отслеживать их, по этому приучил себя возле скобок делать комент типа //--------------------------------------- или конец функций //================================ да и в паскаль делаю тоже самое…но begin end это как то не приводит все в мешанину…

А какая, из ваших перегрузок, по умолчанию? И как получать перегрузки которые не_по_умолчанию.

ну вообще то в документации пишут что если вы пишите var i:=5 то подставляется тип по умолчанию integer, а в вашем случаи тот тип который выдаст функция отнасительно переменной тип который вы подставили, и если вы использовали (var i:= SToR(‘1234’); ) то если есть функция которая возвращает тип по умолчанию integer то ту функцию и подставит компилятор. в этом случаи все просто.

Да, но 5 это integer. А '5' это не integer, это char уже. Это излишнее усложнение - делать специально какой то атрибут или что то типо того, показывающий что первый параметр функции SToR - будет показывает какой тип у возвращаемого значения. И что если передать не константу, а считанную с клавиатуры строку?)).

Сообщение удалено. Причина: оскорбление пользователя.