Или так! (с)
Насколько я понял в 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.
Передавайте в лямбду не отдельные элементы а массив, ну или в вашем случае список.
Ну а если вдуматься в то что вы делаете - сделайте абстрактный класс фигуры, а в его наследниках - описывайте методы чтения и обсчёта чего угодно, типа площади.
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 в связи с другим языком программирования, который сильно устарел к тому же и не развивается.
-
недокументированные потому что есть сложности, не полностью реализованы или другие причины не указывать в Справке?
-
согласно wiki, развитие Паскаля в Модула-2 и дальнейшая оптимизация привели к появлению Оберона (“Компонентный Паскаль”), и уже есть и наш компилятор языка Оберон-2 в байт-код виртуальной машины JVM, разработанный С. Свердловым (Вологда, ВГПУ) ещё в 1998 году. (Это немного смешно, ведь сам Никлас и его ученики часто описывали JAVA как поверхностно переработанную концепцию исходников Pascal-P/Oberon, искажённую С-подобной лексикой, маркетингом и непониманием сути “разумной достаточности”, куда прикрутили многопоточность и исключения, значительно усложняя язык – что фактически повторили и в .NET)
ИМО
Начиная с 2000х, мало кто даже из бывалых программистов пересекался с Lisp, Ada, Fortran и другими языками ниже первого десятка рейтинга TOIBE, однако ещё меньше тех, кто вообще задумывается о множестве и узкопрофильности ЯП или о высказываниях самого Никласа Вирта, что нет универсальности, лишь сфера применения и разная простота - для машины, для человека и для компилятора, или что, к сожалению, вместо изучения науки программирования во многих современных школах (и вузах) изучают конкретный язык, зацикливаясь на сиюминутных, преходящих и никому не нужных мелких особенностях конкретных реализаций. Да, особенности знать нужно, но это не самоцель, особенно если мощный и гибкий компилятор поддерживает несколько ЯП.
Приятно было узнать, что мы с Н.Виртом в этой части думаем совершенно одинаково: чуть иными словами, но эту же мысль я высказывал неоднократно. Нужно знание алгоритмов и технологий программирования, умение при наличии альтернатив выбрать наиболее подходящий для конкретной реализации алгоритм. Алгоритмический язык - он по определению что? Правильно, лишь один из способов записи алгоритма, понятный соответствующему компилятору. Так нужно учить все же дисциплинам программирования или лишь умению угождать конкретному, выбранному кем-то “сверху” компилятору, безмерно тратить дорогое учебное время на то, чтобы создать очередную волну как можно в большей степени покорных программе рабов? А потом мы начинаем вместо аргументации выслушивать нечто в стиле "А потому что вот так это сделано в Си [C++, C#, Pithon, Delphi … непринципиально тут, на что ссылаются].
Именно поэтому, считаю PascalABC.NЕТ, являющийся мультипарадигменным языком, почти идеально (идеала же не существует, верно?, Есть лишь Lim (Идеал) при устремленных в бесконечность желаниях) подходящим именно для обучения дисциплине программирования.
Да, “хотелок” у каждого - на миллион. Предлагайте, но не сетуйте на отказ и не требуйте от разработчиков мотивировки размером с “Войну и Мир”. У них тривиально не хватит на это времени.
И последнее. Не пишу про “IMHO”, поскольку я никого кроме себя тут не представляю, а следовательно, все мои посты всегда выражают лишь мое мнение.
Да, согласен, много зря спорим - какой язык обучать. Да, основа это алгоритм и алгоритмизация. Далее потом язык програм-я. Для обучения PascalABC.Net, это сто процент верно. Но я пока не пробовал соединить с баз данных, например MS SQL. Хотя когда эту тему я поднял. А как говорит Шереметьев - надо программировать баз данных!!! Всем Вам успехов!!!
Это тогда уже не компилятор, а платформа для реализации языков программирования
Такие идеи и попытки у нас были. Но - слишком много сил надо на реализацию чего-то полноценного.
В своё время мы переписывались с С.Свердловым, он задавал тот же самый вопрос, я даже делал какую-то каркасную реализацию и предлагал доделать его команде - но - видимо, там тоже не хватало сил.
Надо сказать, что времена меняются, и со времён Вирта всё-таки языки и парадигмы сильно поменялись. В том числе и в обучении сейчас используются современные примитивы.
Я думаю, что попытка раскрутить сейчас Оберон как язык для обучения обречена. У нас вот попытка раскрутить через 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
, на отдельной строчке.
Давайте все же не будем зацикливаться на идее получения высокой производительности во вспомогательной части учебной программы при разборке алгоритмов, ничего общего не имеющих с генерацией последовательностей или массивов. Обратите внимание на смысл: мы любым способом получаем исходные данные, а концентрируемся (в данном слкчае) на алгоритме бинарного поиска. Говорить о преимуществе в скорости того или иного способа получения ДЕСЯТИ псевдослучайных чисел - это абсурд. Здесь преимущество имеет та запись которая нагляднее и короче. Ее и написать быстрее, и она меньше отвлекает внимание аудитории от истинной цели занятия.
Полностью согласен. Ввод-вывод и генерация правильных исходных данных для составных типов может быть большой проблемой для начинающих. PascalABC.NET позволяет ослабить этот порог.
Какими функциями можно пользоваться при преобразование строки ‘06.13.48’ в тип времени, строки ‘11.03.2018’ в тип дату?