Вы обо мне хорошо думаете…
Только-только начал погружаться в тему и тут на тебе! А какие ещё есть инструменты для работы с таблицами данных (сведение, разведение, сортировка и прочее)?
Хорошая ссылка. Спасибо.
Вы обо мне хорошо думаете…
Только-только начал погружаться в тему и тут на тебе! А какие ещё есть инструменты для работы с таблицами данных (сведение, разведение, сортировка и прочее)?
Хорошая ссылка. Спасибо.
Регулярные выражения - это только разборка символьной строки по совокупности некоторых правил. Не более того. Но ядро сделано на С/С++ (не знаю точно, на чем именно), поэтому при сложных правилах написать разборку даже схожей эффективности - это не для слабонервных.
Я пользуюсь вот этим ресурсом
Уникальный фильм! Как это удалось Карелу Земану сделать в эпоху, когда компьютерной графики не было в помине?
Regex это спецификация. Это значит что у него нет единого ядра, есть только правила реализации. Regex из .Net написан на .Net . То есть на C#.
И даже если бы он был написан на C++ - он слишком много всего пытается предусмотреть. Обычно методов строк .IndexOf
, .SubString
и .Remove
- хватает с головой. И кода оказывается не на много больше. Зато на много читабельнее.
Из примеров - вот, к примеру, недавно писал:
А при чём тут вообще Regex? К примеру, если таблица в формате csv, что наиболее ожидаемо если вы писали это в текстовом файле:
begin
var lns := ReadLines('inp.csv.txt');
var table := lns.Select(l->l.Split(';').ConvertAll(v->v.Trim));
// сортируем по первому столбику
// а если значения первого одинаковые - по второму
table := table.OrderBy(l->l[0]).ThenBy(l->l[1]);
WriteLines('otp.csv.txt', table.Select(l->l.JoinToString('; ')));
end.
Уважаемые коллеги, после объяснения про лямбда-выражения, я не могу не спросить: В чём принципиальная разница между процедурой и функцией?
Почему вот это функция
function ReadAllText(path: string): string;
А вот это процедура?
procedure Reset(f: Text);
У функции есть возвращаемое значение, а у процедуры нет.
Ну, в наш век - процедуры прочти нигде не нужны. Обычно если функция не возвращает ничего нового, как методы .Print
- она возвращает исходный объект, к которому была применена.
Это позволяет писать так:
begin
'abc'.Println.Substring(1).Println;
end.
Конечно, выражение 'abc'
простое, но если бы оно было большим и сложным - факт что .Println
возвращает строку, которую вывело - сильно сократил бы код. Обычно потому что не надо вводить дополнительную переменную.
Вот такой стиль кода, в виде башни вместо тонны отдельных строк и кучи переменных - называется функциональным программированием и является одним из самых современных и часто используемых стилей.
Типы Text
/TextFile
и file of T
морально устарели, поэтому большинство туториалов предполагают использование не просто процедур, но ещё и глобальных подпрограмм вместо методов.
Мама дорогая…
И процедура и функция - это именованные действия с параметрами. Функция дополнительно может возвращать ОДНО значение так, что можно использовать вызов функции в выражении. Например:
var a := Корень(2) + Корень(3):
Просто человек в глубине души остался верен идеологии С/С++, где вместо процедур функция с void. Ну, Вы же помните: “Эллипс - это круг, вписанный в прямоугольник”
Если они не лямбда-процедуры и не лямбда-функции, которые тоже действия с параметрами, только безымянные.
Не вырывайте из контекста. Конечно, если взять без остальной части параграфа - звучит странно.
Это не личное отношение, они не отвечают современным стандартам. О которых, опять же, говорилось в контексте.
Это откуда вообще взято? Хватит приписывать мне любовь к C# и C++.
Само разделение на procedure
и function
более читабельно, чем жуть из C# и C++, где у них общий синтаксис сразу и со свойствами и полями, лишь бы поменьше буковок ставить.
Я сказал только то, что в качественном коде процедурами будут только всякие внутренние вещи вроде Finalize
. А в интерфейсе большинство вещей будут функциями. Если не возвращающими новое значение - возвращающими исходное.
Если язык не функциональный, то зачем, например, при выводе чего-либо возвращать это в качестве результата? Если я вращаю матрицу относительно ее диагонали на месте, зачем мне возвращать ее в качестве значения? Чтобы написать a := RotateDiag(a) ?
Чтобы написать:
a.RotateDiag
.RotateAnotherWay
.RotateAnotherWay2
.Println;
Ну, это самое простое что можно придумать.
С теми же лямбдами:
a->a.RotateDiag
Вместо:
a->
begin
RotateDiag(a);
Result := a;
end
Тут уже большая разница читабельности.
А вообще то, конкретно в данном примере - правильнее возвращать вообще новую матрицу. Это сделает невозможным совершить некоторые баги. В основном те, где в 2 разных местах имеется ссылка на общую матрицу, и изменение одной - неожиданно меняет другую.
Конечно, это всё не применяется к случаю, когда нужна заоблачная производительность. Но части кода, которые написаны по принципу “скорость > читабельность” - не должны попадать в интерфейс “как есть”. То есть это попадает под:
Я же ясно написал:
Ну как не функциональный, если на главной странице:
PascalABC.NET – мультипарадигменный язык. На нём можно писать программы в разных стилях: процедурном, объектном, объектно-ориентированном, функциональном, а также сочетать эти стили, что позволяет формировать различные образовательные траектории в зависимости от уровня и возраста обучаемых.
ИМО - написание в процедурном стиле в PascalABC.Net - это написание в стиле FreePascal, с небольшими вставками современного функционала. Что выглядит ещё уродливее, чем если писать на чистом FreePascal.
Вы сейчас себе же противоречите. Приводите цитату о мультипарадигменности, допускающей несколько стилей, из которых функциональный лишь один - и тут же спрашиваете “Ну как не функциональный”.
Речь о том, что если при программировании не используется функциональная парадигма, то обычно нужны и процедуры, и функции.
Не забываем о школьниках, хорошо?
Только хотел вам о том же написать. А точнее о части про:
различные образовательные траектории
В школах таки всё ещё учат процедурному программированию. И я ни в 1 момент не говорил про то, что типы вроде Text
языку не нужны.
А вот химику из текущего контекста, который не школьник и поэтому не имеет причин быть привязанным к устаревшему процедурному стилю - он таки не нужен.
Учиться - лучше сразу современному.
А вот это никто и не опровергает)) Кроме школьных программ.
Но речь-то шла не о том, чтобы мы за пресловутого “химика” тут решали, что ему нужно, а что нет - он и сам не мальчик, разберется. Речь о том, нужны ли процедуры в языке. По крайней мере, в Вашем изначальном посте не было сказано, что речь идет о Ваших рекомендациях конкретному человеку.
Если брать именно оригинальный пост - это явно был ответ конкретному человеку.
В смысле? Конечно нужны. Я сразу сказал
То есть, другими словами - нужны но редко.
Ага. Т.е. я “наивно купился”. И @Admin повелся тоже. Может быть, все же не так явно следовало из поста, что это Ваше личное мнение о конкретном случае? )))