LINUX.ORG.RU
ФорумTalks

Что есть в паскале, чего нет в современных C++ ?

 , , ,


0

3

Сабж. Существуют ли в Free Pascal и Delphi конструкции, которые нельзя заменить простыми макросами, чтобы программа компилировалась GCC и работала? Помимо read/readln, write/writeln и аналогичных функций для работы со стрингами.

Интересуюсь просто так, поэтому не в Development.

Пока вспомнили:
with, котрый deprecated, но пока нормально компилируется и работает.
Модули.
case. Простейшие вещи из виртовского паскаля работают и в switch, но новые фичи вроде стрингов сделать не так просто.
Длина строки в нулевом байте.
Некоторые операции над строками.

Отдельного упоминания заслуживает Hedgewars, где для контроля качества конвертируют код из FP в C++ и применяют Coverity. Ещё не смотрел.

★★★★★

Последнее исправление: question4 (всего исправлений: 5)

Длина строки в нулевом байте.

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

AlexVR ★★★★★
()
Ответ на: комментарий от question4

Их можно передавать как константные параметры в функции?

void foo_1(string s);
void foo_2(string& s);
void foo_3(const string& s);

При вызове foo_1 строка будет скопирована, менять её внутри функции можно, но это будут изменения копии не отражающиеся на оригинальном значение. foo_2 принимает ссылку, то есть может изменять оригинальное значение. И наконец foo_3 принимает константную ссылку, которую изменять не может (без «хаков»).

DarkEld3r ★★★★★
()
Ответ на: комментарий от Deleted

приучает к правильному принципу: сначала думать, потом программировать

Это приучает лазить вверх-вниз, писать переменные в рандомном порядке, потому что переписывать за**шься и заставляет читать туториал по меткам в виме. А можно было изначально не онанировать. Нет, паскаль по-своему хорош для обучения, но выразительность и редактируемость у него плохонькая.

Вообще-то я бы и в сишке для тривиальных случаев с радостью ушел от отдельных объявлений к чему-то вроде:

double htotal = (double h0 = get_height()) * nlines;
// h0 reused below

А также к временным функ-скоповым переменным, которые и декларировать-то не стоит:

int whatever(char **ps);

if (0 == (@1 = whatever(&@2))) {
    //
}
// @1 is int
// @2 is (@1 ? NULL : string)

Но в принципе можно и @res, @str.

arturpub ★★
()
Ответ на: комментарий от arturpub

Short-circuit evaluation же. Хотя не, вижу and then, or else.

Прочитал статью в Википедии, но не понял разницу между «eager» и «short-circuit». И Дельфи, и Free Pascal, и даже Turbo Pascal по умолчанию — «eager», не будут вычислять 2-ой аргумент, если первый даёт результат. Это поведение можно менять директивами компиляции.

question4 ★★★★★
() автор топика

Длина строки в нулевом байте. Операции над строками. Или нет?

std::string? Раз уж речь про C++. Там, правда, длина строки хранится не в нулевом байте, а отдельно (но точно также абсолютно прозрачно для пользователя), но зато и нет ограничения в 255 символов.

KivApple ★★★★★
()
Ответ на: комментарий от question4

Там были какие-то сложности, что с плюсовым string не работает какое-то тривиальное действие.

Не работает добавление строки-литерала спереди с удобным синтаксисом.

AEP ★★★★★
()
Ответ на: комментарий от arturpub

«eager», т.е. будут вычислять 2-ой аргумент, даже если первый даёт результат

ftfy

Не знаю, что говорит стандарт ISO, но полное вычисление логических выражений с and и or нужно специально включать.

question4 ★★★★★
() автор топика
Ответ на: комментарий от AEP

Не работает добавление строки-литерала спереди с удобным синтаксисом.

Это как? Нельзя сделать

printf("Hello! " + s3);
?

question4 ★★★★★
() автор топика

Параметризированные variant record, аналог union в c, но с параметром-переключателем содержимого. Массивы, индексируемые типами-перечислениями, с автоматической проверкой типов переменных-индексаторов при компиляции при компиляции.

shimshimshim
()
Ответ на: комментарий от theNamelessOne

говорят, уже есть в компиляторах от майкрософт и шланге

next_time ★★★★★
()
Ответ на: комментарий от multihead

Безопасный компилятор, с проверками памяти.

как раз таки есть

Но системщики сидящие на С взбунтуют

а вот у этих нет, согласен

next_time ★★★★★
()
Ответ на: комментарий от question4

У Яндекса ситуевина была лучше. Но всеравно скатился в мэйл.ру

dmxrand
()
Ответ на: комментарий от Arrest

но в std, кажется, обычно реализация с null-terminated.

именно, что кажется

next_time ★★★★★
()
Ответ на: комментарий от next_time

И какой синтаксис тех же variant record/tagged union? Разве что вложенный в структуру union городить, но автоматической проверки типов все равно не будет. Интересуюсь без желания подколоть, просто в свое время ничего подобного в сpp не видел.

shimshimshim
()
Ответ на: комментарий от shimshimshim

И какой синтаксис тех же variant record/tagged union?

На шаблонах вполне делается. +обёртка из макросов для полной идентичности паскалевскому синтаксису, если очень хочется.

next_time ★★★★★
()
Ответ на: комментарий от question4

И не просто сымитировать, а средствами std можно складывать строки по стандарту. Прочие операции тоже имеются.

next_time ★★★★★
()
Ответ на: комментарий от question4

можно передавать

с плюсовым string не работает какое-то тривиальное действие

«world» + " " не сработает, но с макросами это решаемо

next_time ★★★★★
()
Ответ на: комментарий от arturpub

паскаль по-своему хорош для обучения

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

next_time ★★★★★
()
Ответ на: комментарий от next_time

Плоха та переменная, название которой требует шатания по коду.

Deleted
()
Ответ на: комментарий от theNamelessOne

Умеющие в неймспейсы хотя бы. Здесь С++ в выигрыше.

buddhist ★★★★★
()
Ответ на: комментарий от next_time

И всякий доступ к нулевому байту строки нужно обрабатывать при конверсии.

конверсии чего?

Паскалевской программы в сишную при помощи макросов.

Я имел в виду, что если есть стринг S, то помимо вызовов StrLen(S) надо отловить все обращения к S[0].

question4 ★★★★★
() автор топика
Ответ на: комментарий от next_time

И какой синтаксис тех же variant record/tagged union?

На шаблонах вполне делается. +обёртка из макросов для полной идентичности паскалевскому синтаксису, если очень хочется.

И не просто сымитировать, а средствами std можно складывать строки по стандарту. Прочие операции тоже имеются.

можно передавать

с плюсовым string не работает какое-то тривиальное действие

«world» + " " не сработает, но с макросами это решаемо

Можно по примеру на каждое из заявлений?

question4 ★★★★★
() автор топика
Ответ на: комментарий от ilovewindows

Процедуры(функции) внутри процедур(функций).

Интересно получается. Nested functions доступны в GCC, но только для C. И есть какой-то финт, позволяющий получить почти их, в C++11.

question4 ★★★★★
() автор топика
Ответ на: комментарий от shimshimshim

И какой синтаксис тех же variant record/tagged union? Разве что вложенный в структуру union городить, но автоматической проверки типов все равно не будет. Интересуюсь без желания подколоть, просто в свое время ничего подобного в сpp не видел.

boost::variant
quiet_readonly ★★★★
()
Ответ на: комментарий от question4

Интересно получается. Nested functions доступны в GCC, но только для C. И есть какой-то финт, позволяющий получить почти их, в C++11.

Лямбда-функции внутри функций никто не мешает писать, чем постоянно и пользуются. Захват переменых и сохранение самой лямбды в именованую переменную — очевидные приёмы.

quiet_readonly ★★★★
()
Ответ на: комментарий от shimshimshim

и integer(pchar(var)^) или как там в паскале указатели работают

Разницы с сишными указателями не заметил.

question4 ★★★★★
() автор топика
Ответ на: комментарий от nvidia

cout<< «hello"s + „world\n“;

Да, я имел в виду это. И это есть в c++14, который уже вышел, поэтому, строго говоря, ответом на вопрос топикстартера не является.

AEP ★★★★★
()
Ответ на: комментарий от no-such-file

Существуют ли в Free Pascal и Delphi конструкции, которые нельзя заменить

Очевидно не существуют, т.к. все тьюринг-полные языки эквивалентны с точки зрения реализуемости алгоритмов.

Ну да, лепишь в сиплюсах загогулистую ассемблерную вставку и заменяешь простую и удобную паскалевскую конструкцию - тьюринг полнота соблюдена! Например, в паскале операсор case удобный и хорошо спроектированный, после него сишный switch заставляет плеваться и вспоминать родственников внедрителей С\С++ по женской линии. Таких «мелочей» набирается много, как только пытаешься сделать продвинутую логику на ассемблере на стероидах. Ассемблер он и есть ассемблер, он не для удобства человеков а для ограничения их возможностей неудобствами не дающими выражать мысли теоретически могущие перегрузить машину. Вот только сиплюсовые линуксы стали кушать намного больше а языковые неудобства никуда не пропали.

Napilnik ★★★★★
()
Последнее исправление: Napilnik (всего исправлений: 1)
Ответ на: комментарий от next_time

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

Нельзя пропатчить компилятор и разрешить имена на русском?

даже плюсы в этом отношении луше выглядят: там хоть дефайнами можно накостылять.

Замучаешься этот код разбирать.

Napilnik ★★★★★
()
Ответ на: комментарий от question4

Шикарно, у нас в проекте hedgewars есть транслятор для движка с паскаля на си. Получающийся код запихивали в coverity, много полезного надиагностировалось.

unC0Rr ★★★★★
()
Ответ на: комментарий от question4

Сравнение с чаром:

if s = 'a' then
Здесь s может быть как строкой, так и char. Автоматическое приведение к типу PChar. Сложение двух PChar-ов:
var a, b, c: PChar;
...
a:= 'a';
b:= 'bc';
c:= a + b;
.

А для простого shortstring достаточно легко написать класс.

unC0Rr ★★★★★
()
Ответ на: комментарий от Napilnik

после него сишный switch заставляет плеваться и вспоминать родственников внедрителей С\С++ по женской линии.

Зато на case метод Даффа не реализуется. Хотя этот метод один сплошной хак. :)

atrus ★★★★★
()
Ответ на: комментарий от mystery

Но вот C++ - это Си, из которого выпилили Си и разбавили говно

Что плохого писать на крестах в С-style, но с использованием некоторых фишек? Чем тот же Qt плох?

Loki13 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.