Огромный минус. Получается мусорная свалка из переменных, где уже непонятно, кто за что отвечает. И мотаешься туда-сюда по коду.
Наши опыты со школьниками показали, что не надо говорить о явных типах сразу. Можно лишь упоминать типы и не вводить их явно. Запись
var a := 1;
означает, что переменная a вводится первый раз и инициализируется целым. И потом целой будет всегда.
Ещё раз повторюсь - эта технология обкатывается нами каждый год на 200-300 школьниках. И никаких проблем.
Проблемы у нас наступали тогда, когда у нас появлялся такой извиняющийся преподаватель и говорил семиклассникам, что вот - в старом Паскале было так, и переменные описывались с типами, и нельзя было сразу значение присвоить, а в PascalABC.NET по-другому, вот так. Бедные школьники смотрели на него как на ненормального. Зачем объяснять - говорили они - когда и так всё понятно:
var a := 1;
Я склонен полагать, что есть синдром извиняющегося за прошлое преподавателя. Я также склонен полагать, что в большинстве переучиться учителю практически невозможно - и надо воспитывать следующее поколение учителей.
Наше общение именно с молодыми учителями было очень положительным и понимание было или с полуслова или высокое.
begin
var (n, k) := ReadInteger2;
var ma := ReadArrInteger(n);
var (max1, max2) := (0, 0);
foreach var i in 1..n-k do
begin
var x := ReadInteger;
var r := i mod k;
if ma[r] + x > max1 +max2 then
(max1, max2) := (ma[r], x);
if x > ma[r] then
ma[r] := x
end;
Print(max1, max2)
end.
Что здесь сложного по сравнению с Питоном - ума не приложу. Единственное отличие - map в Питоне рассматривается как заклинание. Потому что в Питоне нет достойного ввода по одному числу из строки - только всю строку целиком надо считывать.
Ну и как преподаватель я не могу с этим смириться - когда map появляется уже на первом занятии при вводе двух целых.
Я намеренно написал как можно ближе к питоновскому коду. Поскольку почему-то показалось, что @Danov сделал упор, что список лучше (?) динамического массива. И потом уже писал, что список тут ни разу не нужен.
Ещё выложу если интересно. Но там не то, что вы ожидаете. Мы не педагоги в первую очередь, где будет описано про дидактику и проведён статистический анализ на детях, изучающих PascalABC.NET и детях из контрольной группы.
Мы массово в течение более 20 лет готовим школьников с 6 класса к поступлению в ВУЗ на ИТ-шные профессии. Много школьников. Конечно, зовём на мехмат ЮФУ. Но жизнь - она многогранная - поступают в кучу мест. А потом выясняется, что в Компьютерной школе их учили лучше и современнее.
Приветствую всех, у меня есть предложение, сделать темы для паскаля: “Темная” и “Стандарт” (к примеру) . Будет ли такая задумка когда нибудь реализована?
Проект открытый. Возьмите и добавьте. Разработчиков на данным момент - два человека. Поверьте, у них сейчас есть задачи куда поважнее раскрашивания интерфейсов.
Прошу добавить для decimal (возможно, ещё для BigInteger, но я не проверял, все ли есть у BigInteger) во встроенные все подпрограммы, что есть у других типов и подходят для decimal. Поскольку, скорее всего, у разработчиков
Хотя, по моему, в PABCSystem это не так уж и нужно. Случаи где decimal придётся вводить с клавиатуры - это в довольно специфичных проектах, где лучше описать такую подпрограмму самостоятельно.
У вас может есть локальная версия этих файлов и пока вы сидите в мастере - вам не важно.
А у меня эти файлы удаляет при каждом прыжке между ветками. И без них проект не собирается.
Пожалуйста, или добавьте их назад, или сделайте так чтоб при сборке проекта вызывался этот .bat:
type
t1<T> = class
//Ошибка: Возвращаемое значение или параметр должны иметь тип t1<T>
// static function operator implicit(a: t1<byte>): t1<word> := new t1<word>;
end;
//Ошибка: extension-операторы преобразования типов допустимы только для классов из других сборок .NET
//function operator implicit(a: t1<byte>): t1<word>; extensionmethod := new t1<word>;
begin end.
То есть сейчас определить неявное преобразование между t1<byte> и t1<word> невозможно.
Может разрешите внутри класса?
В OpenCL в кернел можно передавать как буфер, так и значение из оперативки. Вот в OpenCLABC второе раньше было невозможно.
Сейчас решил сделать возможным, ввёл тип KernelArg, к которому можно преобразовать указатель, запись или буфер. А определить преобразование CommandQueue<Buffer> в CommandQueue<KernelArg> оказывается нельзя.
Сергей, а почему распаковки кортежей нет? В чем тут идея?
begin
readarrinteger(readinteger)
.Combinations(2)
.Select(x->(x[0],x[1])) // ниже строчка не работает
.Where((a,b)->((a+b)mod 80 =0)and((a>50)or(b>50)))
.Print();
end.
begin
ReadArrInteger(ReadInteger)
.Combinations(2)
.Select(x -> (x[0], x[1]))
.Where(t -> ((t[0] + t[1]) mod 80 = 0) and ((t[0] > 50) or (t[1] > 50)))
.Print;
end.
Что до Питона - зачем его копировать? Оттуда и так взято все полезное)))
Например, кортежное присваивание есть var (a,b,c) := (5,8,13); в все написанные Вами примеры легко моделируются (если они вообще в Паскале смысл имеют).
Мы на форуме общаемся не первый год по добавлению новшеств в язык, позиция разработчика была прежде такой: “Если Вам надо все, как в С++, просто пишите на С++)”. То же и о Питоне.
Вот идея именованных элементов кортежей уже давно витает в воздухе.