Hello, Andrey Solomatov! You wrote in conference fido7.ru.embedded to Dmitry Orlov on Mon, 24 Oct 2005 09:50:13
+0000 (UTC):
DT>>> Hу и чего на паскале нельзя выразить, что можно на C? :) По
DO>> Многое на самом деле. Те же операторы ++, += - они яснее DO>> выражают что я хочу сделать, чем паскалевские эквиваленты.
AS> Яснее, только если ты в курсе, что означают эти закорючки. AS> Ибо это не общепринятые операции (в математическом смысле).
Операция плюс в языке программирования и в математике - существенно разные вещи. В математике 127+1 - всегда 128, а в языках программирования может быть и -1 и много чего еще.
DO>> Стандартная адресная арифметика, которая на паскале DO>> заменяется форменным хакерством, причем реально используется.
AS> Стандартная адресная арифметика всегда является хакерством.
В паскале - в большей степени. В С учитывается автоматически размер того, на что указывает адрес, а в паскале это надо вручную указывать.
DO>> Та же невозможность описать на паскале функцию с переменным DO>> числом параметров, DO>> что опять же обходится, но опять же некрасиво и полухакерски.
AS> С учётом того, что в Си эллипсис - это тоже полухак...
Вовсе нет, почему? Не более хакерская, чем передавать в функцию указатель, а уж это в паскале на право и на лево делается.
DO>> А его и нет в языке - это библиотека, которой ты можешь пользоваться, а AS> можешь и свою написать, в отличие от жестко привязанного к stdout Write,
AS> Вывод в произвольный файл на паскале обеспечивал, насколько AS> мне помнится, почти такой-же Write (только первый параметр - файл).
Да и stdout можно было переназнчить, что в частности стартап модуля CRT и делал, только все равно не гибко все это очень.
AS> Если требовался выод чего-то специфического - городим свою AS> функцию с выводом результата в виде строки.
И сгородили, звалась drivers.formatstr. Посмотри на сколько коряво в сравнении с sprintf все это выглядит.
DO>> который ты никак изменить не в силах и если у тебя формат DO>> вывода должен задаваться динамически, DO>> возможно извне, прийдется ручками писать аналог printf, потому что write - это не DO>> процедура, это макрос, раскручиваемый компилятором во время DO>> компилирования. Причем управление форматом вывода куда более уродское и менее DO>> гибкое, чем в [s]printf.
AS> Ну, собственно, за пределы вывода строк/символов/числе AS> способности printf не распространяются -
Это уже не мало. В паскале и для этого городить приходится.
AS> так что "городить" придётся и там - и там. AS> А поскольку паскаль - язык со строгой типизацией, то подсунуть
Это виртовский паскаль, а турбо-паскаль - нет. Не более строгий, чем ANSI-C, пожалуй даже менее.
AS> ему "неизвестный тип данных"
Хочешь удивлю? Попробуй найти где-нибудь турбо-паскаль и скормить ему такой текст:
{$A+,B+,D+,E+,F-,G-,I+,L+,N+,O-,P-,Q-,R-,S+,T-,V-,X+,Y+} {$M 16384,0,655360}
type Digits = '0'..'9'; DigSet = set of Digits;
var ds: DigSet; i: integer; d: double;
function t(var v): byte; begin t := byte(v); end;
begin ds := ['0']; ds := ds+['d']; d:=i; t(ds); i := t(ds); d := t(i); end.
и скомпилировать. Сожрет за милую душу. И после этого мне кто-то будет втирать, что паскаль (в его борланодовской инкарнации) строгий язык? Подозреваю, что вы его просто плохо знаете...
AS> действительно слегка затруднительно - именно в силу построения AS> языка.
Ась? Какого типа "v" в вышеприведенном примере?
AS> В отстальном - не вижу особой разницы.
Посмотри на то как "изящно" вызывается drivers.formatstr по сравнению с sprintf и может быть увидишь разницу.
dima
formatting link