Помощь новичкам

Или так! (с)

Насколько я понял в CRT/консоли нет понятия текстового режима 25/40/80 не работает Window и нет абсолютного/прямого доступа к портам/памяти. А можно ли без лишнего дублирования экранной области узнать цветовые атрибуты в указанных координатах вроде ATTR(const x,y:byte): byte?

Спс

Вроде нет, обычно если такое нужно - делают свой врапер для консоли.

Как передать аргументы из списка (args) в лямбду, если заранее не известно, сколько в списке окажется элементов (зависит от ввода)? Вот такой код:

begin
  var lambda1: real-> real := x -> x * x * 3.14;
  var lambda2: (real,real)-> real := (x, y)-> x * y;
  
  var s := ((1, lambda1), (2, lambda2));
  
  var f := Dict(
    kv('круг', 1),
    kv('прямоугольник', 2));
  
  var args := new list<real>;
  
  foreach var x in range(f[ReadlnString()]) do
    args.Add(ReadlnReal());
  
  var Square := s[args.Count - 1][1](...???); // <---
  Print(Square)
end.

Передавайте в лямбду не отдельные элементы а массив, ну или в вашем случае список.

1 лайк

Ну а если вдуматься в то что вы делаете - сделайте абстрактный класс фигуры, а в его наследниках - описывайте методы чтения и обсчёта чего угодно, типа площади.

aaa… не получается

var Square := s[(args.Count-1)][1](args); // <-- индекс кортежа должен быть константным выражением

Зарработало!

begin
  var lambda1: List<real>-> real := x -> x[0] ** 2 * 3.14;
  var lambda2: List<real>-> real := x -> x[0] * x[1];
  
  var s := Dict(kv(1, lambda1), kv(2, lambda2));
  
  var f := Dict(
    kv('круг', 1),
    kv('прямоугольник', 2));
  
  var args := new list<real>;
    
  foreach var x in range(1, f[ReadlnString()]) do
    args.Add(ReadlnReal());
  
  var Square := s[(args.Count)](args);
  Print(Square)
end.

В файле помощи даже в “Раздел uses” не нашёл описание и нюансы структуры вида

Uses TreeConverterUnit in 'TreeConverter.dll';

Также в файле Middle_End_Compiler_PascalABC.NET.ppt на третьем слайде презентации компилятора параллельно с PABC.NEТ упоминается продолжение работы Вирта – компилятор Oberon2, что существенно расширяет ценность PABC.NEТ даже в сфере обучения. На какой стадии разработки и где можно узнать о планах?

Благодарю

Это недокументированные возможности.

Middle_End_Compiler_PascalABC.NET.ppt наверное очень старый. Лет 10 ему… Честно сказать, я не понял, как может расширяться полезность PascalABC.NET в связи с другим языком программирования, который сильно устарел к тому же и не развивается.

1 лайк
  1. недокументированные потому что есть сложности, не полностью реализованы или другие причины не указывать в Справке?

  2. согласно wiki, развитие Паскаля в Модула-2 и дальнейшая оптимизация привели к появлению Оберона (“Компонентный Паскаль”), и уже есть и наш компилятор языка Оберон-2 в байт-код виртуальной машины JVM, разработанный С. Свердловым (Вологда, ВГПУ) ещё в 1998 году. (Это немного смешно, ведь сам Никлас и его ученики часто описывали JAVA как поверхностно переработанную концепцию исходников Pascal-P/Oberon, искажённую С-подобной лексикой, маркетингом и непониманием сути “разумной достаточности”, куда прикрутили многопоточность и исключения, значительно усложняя язык – что фактически повторили и в .NET)

ИМО

Начиная с 2000х, мало кто даже из бывалых программистов пересекался с Lisp, Ada, Fortran и другими языками ниже первого десятка рейтинга TOIBE, однако ещё меньше тех, кто вообще задумывается о множестве и узкопрофильности ЯП или о высказываниях самого Никласа Вирта, что нет универсальности, лишь сфера применения и разная простота - для машины, для человека и для компилятора, или что, к сожалению, вместо изучения науки программирования во многих современных школах (и вузах) изучают конкретный язык, зацикливаясь на сиюминутных, преходящих и никому не нужных мелких особенностях конкретных реализаций. Да, особенности знать нужно, но это не самоцель, особенно если мощный и гибкий компилятор поддерживает несколько ЯП.

Приятно было узнать, что мы с Н.Виртом в этой части думаем совершенно одинаково: чуть иными словами, но эту же мысль я высказывал неоднократно. Нужно знание алгоритмов и технологий программирования, умение при наличии альтернатив выбрать наиболее подходящий для конкретной реализации алгоритм. Алгоритмический язык - он по определению что? Правильно, лишь один из способов записи алгоритма, понятный соответствующему компилятору. Так нужно учить все же дисциплинам программирования или лишь умению угождать конкретному, выбранному кем-то “сверху” компилятору, безмерно тратить дорогое учебное время на то, чтобы создать очередную волну как можно в большей степени покорных программе рабов? А потом мы начинаем вместо аргументации выслушивать нечто в стиле "А потому что вот так это сделано в Си [C++, C#, Pithon, Delphi … непринципиально тут, на что ссылаются].

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

Да, “хотелок” у каждого - на миллион. Предлагайте, но не сетуйте на отказ и не требуйте от разработчиков мотивировки размером с “Войну и Мир”. У них тривиально не хватит на это времени.

И последнее. Не пишу про “IMHO”, поскольку я никого кроме себя тут не представляю, а следовательно, все мои посты всегда выражают лишь мое мнение.

1 лайк

Да, согласен, много зря спорим - какой язык обучать. Да, основа это алгоритм и алгоритмизация. Далее потом язык програм-я. Для обучения PascalABC.Net, это сто процент верно. Но я пока не пробовал соединить с баз данных, например MS SQL. Хотя когда эту тему я поднял. А как говорит Шереметьев - надо программировать баз данных!!! Всем Вам успехов!!!

Это тогда уже не компилятор, а платформа для реализации языков программирования :slight_smile:

Такие идеи и попытки у нас были. Но - слишком много сил надо на реализацию чего-то полноценного.

В своё время мы переписывались с С.Свердловым, он задавал тот же самый вопрос, я даже делал какую-то каркасную реализацию и предлагал доделать его команде - но - видимо, там тоже не хватало сил.

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

Я думаю, что попытка раскрутить сейчас Оберон как язык для обучения обречена. У нас вот попытка раскрутить через PascalABC.NET нормальные современные средства программирования, не уступающие скажем Python, идёт с большим скрипом - и это при том, что Pascal - это меинстрим в обучении программированию в России - что бы там ни говорили.

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

Немного подумал - и решил, что меня тут можно заподозрить в некоторой непоследовательности. Но, даже если согласиться, что учить нужно не языку ради языка, все же какой-то язык нужен, поскольку алгоритмы приходится записывать и проверять их работу на компьютере. И вот тут PascalABC.NЕТ подходит прекрасно. Время вхождения в язык минимально, наличие конструкций, реализующих базовые элементы алгоритмов (следование, “развилка” по условию, циклы любых разновидностей, ввод-вывод, подпрограммы) позволяет легко переходить от блок-схем или словесных формулировок к программам. Обилие синтаксического сахара дает возможность, однажды рассмотрев какой-то базовый алгоритм, в последующем больше к нему не возвращаться, используя заменяющий примитив языка, что существенно экономит время преподавателей и обучаемых. Мультипарадигменность позволяет соединять в одной программе, например, структурный, процедурный, объектно-ориентированный и функциональный подходы, делая программу короткой, понятной и в то же время эффективной. Мы можем позволить себе, рассматривая очередной алгоритм или технологию, сосредоточиться только на непосредственной реализации. Например, разбирая реализацию бинарного поиска, мы должны где-то взять упорядоченный массив, вывести его значения до поиска, задать значение искомой величины, а завершив поиск, показать его результат. И это можно оформить, к примеру, следующим образом:

begin
  var a := SeqRandom.Sorted.ToArray; // отсортированный массив
  a.Println; // вывод
  var b := ReadInteger; // что ищем?
  // тут реализация поиска и результаты
end.

А впоследствии можно пользоваться примитивом var i := a.BinarySearch(ReadInteger);

.ToArray для yield-последовательностей работает плохо, медленно. Лучше ArrRandom и для него .Sort, на отдельной строчке.

Давайте все же не будем зацикливаться на идее получения высокой производительности во вспомогательной части учебной программы при разборке алгоритмов, ничего общего не имеющих с генерацией последовательностей или массивов. Обратите внимание на смысл: мы любым способом получаем исходные данные, а концентрируемся (в данном слкчае) на алгоритме бинарного поиска. Говорить о преимуществе в скорости того или иного способа получения ДЕСЯТИ псевдослучайных чисел - это абсурд. Здесь преимущество имеет та запись которая нагляднее и короче. Ее и написать быстрее, и она меньше отвлекает внимание аудитории от истинной цели занятия.

1 лайк

Полностью согласен. Ввод-вывод и генерация правильных исходных данных для составных типов может быть большой проблемой для начинающих. PascalABC.NET позволяет ослабить этот порог.

Какими функциями можно пользоваться при преобразование строки ‘06.13.48’ в тип времени, строки ‘11.03.2018’ в тип дату?