Hello, !
You wrote on Wed, 01 Oct 2003 11:31:38 GMT:
S>> Понятно. А где 4 в качестве начального значения N задается?
> А это когда даешь команду вроде test (1234, 4, []). Если хочется, можно > создать еще одну функцию, вроде
> start (X) :- test (X, 4, []).
Ну я так и подумал.
> А можно задать и другое значение.
Низзя — это уже другая программа получается, т.е. перевод с паскаля на пролог некорректен.
И, кстати, списков тоже два должно быть, Err не выставляется — как полноценный перевод-то будет выглядеть?
Best regards,
Sergey.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, zaiats_2k, Вы писали: _>Это настолько важно? Include\Exclude были добавлены в TurboPascal только с одной целью — повышение скорости добавления\удаления одиночного значения в\из множество. Вопреки синтаксису похожему на вызов процедуры, Include и Exclude, это не есть процедуры. Компилируются они в ОДНУ ассемблерную команду. Логически же это тоже самое пересечение множества с другим множеством, состоящим из одного элемента.
Ну так мы и говорим не об ассемблерных командах, а об синтаксисе языка. Дело в том, что в Pascal искусственно введены такие вот синтаксические нелепости, которые призваны обойти отсутствие возможности декларировать
template<class T>
inline Include(bitset<T> &set, T element)
{
...
}
которая еще и превращалась бы в одну asm команду. На плюсах сэмулировать этот синтаксис не составляет ни малейшего труда. И даже ввести более удобный.
... << RSDN@Home 1.1 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Ну так мы и говорим не об ассемблерных командах, а об синтаксисе языка. Дело в том, что в Pascal искусственно введены такие вот синтаксические нелепости...
Дело в том, что множества были в ведены в Паскаль по причине полного отсутствия там битовых операторов. Я имею в виду Виртовский Паскаль. С тех пор ни там и остались в виде никому не нужного рудимента. На Turbo Pascal ваш пример легко переписать не используюя множесва вообще. И всё это здорово скомпилируется во вполне эффективный код.
0 программистов ругал сердитый шеф,
потом уволил одного, и стало их FF!
Здравствуйте, zaiats_2k, Вы писали: _>Дело в том, что множества были в ведены в Паскаль по причине полного отсутствия там битовых операторов. Я имею в виду Виртовский Паскаль. С тех пор ни там и остались в виде никому не нужного рудимента. На Turbo Pascal ваш пример легко переписать не используюя множесва вообще. И всё это здорово скомпилируется во вполне эффективный код.
Ок, давайте же сделаем это. Я готов не ограничитваться Torbo Pascal — все, что съест Delphi 7 меня устроит. Что предлагается нам взамен набивших оскомину множеств на Паскале? Кусок кода вроде бы не столь уж велик...
... << RSDN@Home 1.1 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[18]: мнение о Delphi
От:
Аноним
Дата:
01.10.03 12:49
Оценка:
Здравствуйте, Sergey, Вы писали:
S>Hello, ! S>You wrote on Wed, 01 Oct 2003 11:31:38 GMT:
S>>> Понятно. А где 4 в качестве начального значения N задается?
>> А это когда даешь команду вроде test (1234, 4, []). Если хочется, можно >> создать еще одну функцию, вроде
>> start (X) :- test (X, 4, []).
S>Ну я так и подумал.
>> А можно задать и другое значение.
S>Низзя — это уже другая программа получается, т.е. перевод с паскаля на пролог некорректен.
S>И, кстати, списков тоже два должно быть, Err не выставляется — как полноценный перевод-то будет выглядеть?
Здравствуйте, Sinclair, Вы писали:
S>Ок, давайте же сделаем это. Я готов не ограничитваться Torbo Pascal — все, что съест Delphi 7 меня устроит. Что предлагается нам взамен набивших оскомину множеств на Паскале? Кусок кода вроде бы не столь уж велик...
Да теже самые битовые операции. Компилятора под рукой небыло, посему за работоспособность не отвечаю, но где-то так:
var
j, SD, A, D: integer;
begin
SD := 0;
for j := 4 downto 1 do begin
D := A mod 10;
A := A div 10;
if ((boolean)((1 shl D) and SD)) then begin
Err := -2;
Break;
end
else begin
SD = SD or (1 shl D));
end;
end;
end;
0 программистов ругал сердитый шеф,
потом уволил одного, и стало их FF!
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, zaiats_2k, Вы писали: _>>Include появилась толи в 6м толи в 7м Turbo Pascal'е. S>Может быть. Но у Вирта ее совершенно точно не было — было только объединение/пересечение множеств.
Сейчас под рукой нет книги Н.Вирта и К.Йенсен с описанием классического Pascal. Но вот в компиляторе от Йенсен Include() и Declude() уже были. Да и как им не быть, если на типе д.б. определены элементарные операции. Кстати, чем объединение отличается от Include()?
Здравствуйте, zaiats_2k, Вы писали:
Ну, это уже на самом деле перевод перевода. То есть теперь мы имеем длинный текст (одно только выражение ((1 shl D) and SD)<>0 чего стоит), который не является типобезопасным и чреват ошибками. Нам удалось добиться соединения недостатков языков С и Pascal. На мой взгляд, это не то, к чему надо стремиться.
... << RSDN@Home 1.1 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, FWP, Вы писали: FWP>Сейчас под рукой нет книги Н.Вирта и К.Йенсен с описанием классического Pascal. Но вот в компиляторе от Йенсен Include() и Declude() уже были. Да и как им не быть, если на типе д.б. определены элементарные операции. Кстати, чем объединение отличается от Include()?
а) оно работает над множествами, а не над элементами
б) оно не модифицирует аргумент, т.е. a=b+с не совсем то же самое, что a+=b.
... << RSDN@Home 1.1 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, zaiats_2k, Вы писали:
_>Здравствуйте, Sinclair, Вы писали:
S>>Ну так мы и говорим не об ассемблерных командах, а об синтаксисе языка. Дело в том, что в Pascal искусственно введены такие вот синтаксические нелепости...
_>Дело в том, что множества были в ведены в Паскаль по причине полного отсутствия там битовых операторов. Я имею в виду Виртовский Паскаль. С тех пор ни там и остались в виде никому не нужного рудимента. На Turbo Pascal ваш пример легко переписать не используюя множесва вообще. И всё это здорово скомпилируется во вполне эффективный код.
И мы получим сишный аналог. И такой же читаемый
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, zaiats_2k, Вы писали: S>Ну, это уже на самом деле перевод перевода. То есть теперь мы имеем длинный текст (одно только выражение ((1 shl D) and SD)<>0 чего стоит), который не является типобезопасным и чреват ошибками. Нам удалось добиться соединения недостатков языков С и Pascal. На мой взгляд, это не то, к чему надо стремиться.
В моём тексте какжется было не совсем так, как вы цитируете: "((1 shl D) and SD)<>0)"...
И покажите мне, плиз, "типоопасность" в моём коде?
Да и предназначен он был всего лишь для демонстрации возможности обойтись без "синтаксических нелепостей", как вы имели честь их назвать. ))
0 программистов ругал сердитый шеф,
потом уволил одного, и стало их FF!
Здравствуйте, zaiats_2k, Вы писали: _>В моём тексте какжется было не совсем так, как вы цитируете: "((1 shl D) and SD)<>0)"...
То, как было у вас в тексте, не будет компилироваться, т.к. во-первых, в Паскале нет синтаксиса С-style cast, а во-вторых, приведение целого к boolean запрещено. _>И покажите мне, плиз, "типоопасность" в моём коде?
все очень просто. Если у нас D в этом выражении больше, чем sizeof(integer), то код перестанет работать, а компилятор нам об этом ничего не скажет. Исходный код с множествами в этом смысле гораздо безопаснее — там нельзя включить в множество элемент, которого в нем не может быть. _>Да и предназначен он был всего лишь для демонстрации возможности обойтись без "синтаксических нелепостей", как вы имели честь их назвать. ))
Я все это прекрасно понимаю. Дело в том, что идя по этой дороге, мы придем к пониманию того, что от всех нелепостей лечит ключевое слово asm. Но это возврат в каменный век!
Возвращаясь к теме — речь шла о сравнении длин программ на С++ и на Pascal. При прочих равных выясняется, что длина кода в плюсах будет меньше, т.к. там можно перегружать операторы (а запись a+=b всегда короче, чем a:= Add(a, b)) и операторные скобки занимают в сумме 2 символа ({}) вместо 8 (begin/end). Единственное место, где Delphi лапидарнее — это ключевое слово with. Не думаю, что с его помощью удастся значительно сократить программу, т.к. для большинства его применений в С++ есть альтернативные методы, которые к тому же приводят к более читаемому коду.
Благодаря наличию шаблонов выразительность кода еще повышается, позволяя значительно сократить объем библиотек.
Да, в язык Delphi встроено много паттернов, которые пришлось бы реализовывать вручную на плюсах. Но их проблема в том, что любой отход от паттерна в сторону сразу приводит к раздуванию кода, т.к. каждый из них уникален. Попробуйте хранить доп. информацию о свойствах класса! В язык С++ встроены более мощные средства выражения самих паттернов, что позволяет реализовывать почти всю ту же функциональность самому. Как писал Страуструп — в С++ нет встроенного типа complex, но при нужде его можно определить средствами языка так, чтобы он был не хуже встроенного ни с точки зрения синтаксиса, ни с точки зрения производительности. Там, где Delphi дает рыбу, С++ дает удочку.
Преимуществом Delphi является то, что не нужно особо следить за съедобностью этой рыбы.
... << RSDN@Home 1.1 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, zaiats_2k, Вы писали: _>>В моём тексте какжется было не совсем так, как вы цитируете: "((1 shl D) and SD)<>0)"... S>То, как было у вас в тексте, не будет компилироваться, т.к. во-первых, в Паскале нет синтаксиса С-style cast, а во-вторых, приведение целого к boolean запрещено.
Ну ладно, ладно, я уже 3 года не писал на Дельфи, забыл. Там синтаксис такой boolean(I). И приведение не запрещено.
_>>И покажите мне, плиз, "типоопасность" в моём коде? S>все очень просто. Если у нас D в этом выражении больше, чем sizeof(integer), то код перестанет работать, а компилятор нам об этом ничего не скажет. Исходный код с множествами в этом смысле гораздо безопаснее — там нельзя включить в множество элемент, которого в нем не может быть.
D в нашем случае остаток от деления на 10, и больше 9 он не может быть по определению. А работать оно перестанет не при sizeof(integer)+1, а при sizeof(integer)*8+1 ))
S>Возвращаясь к теме — речь шла о сравнении длин программ на С++ и на Pascal. При прочих равных выясняется, что длина кода в плюсах будет меньше, т.к. там можно перегружать операторы (а запись a+=b всегда короче, чем a:= Add(a, b)) и операторные скобки занимают в сумме 2 символа ({}) вместо 8 (begin/end). Единственное место, где Delphi лапидарнее — это ключевое слово with. Не думаю, что с его помощью удастся значительно сократить программу, т.к. для большинства его применений в С++ есть альтернативные методы, которые к тому же приводят к более читаемому коду.
Как тут уже правильно заметили — учить слепой десятипальцевый надо. И тогда длина кода на 15% большая не будет для тебя аргументом. Да и переменные перестанешь называть A, D и SD. ))
S>Благодаря наличию шаблонов выразительность кода еще повышается, позволяя значительно сократить объем библиотек.
Да с этим никто давно уже не спорит, кроме тех кто не может\не хочет разобраться с шаблонами.
S>Да, в язык Delphi встроено много паттернов, которые пришлось бы реализовывать вручную на плюсах. Но их проблема в том, что любой отход от паттерна в сторону сразу приводит к раздуванию кода, т.к. каждый из них уникален. Попробуйте хранить доп. информацию о свойствах класса! В язык С++ встроены более мощные средства выражения самих паттернов, что позволяет реализовывать почти всю ту же функциональность самому. Как писал Страуструп — в С++ нет встроенного типа complex, но при нужде его можно определить средствами языка так, чтобы он был не хуже встроенного ни с точки зрения синтаксиса, ни с точки зрения производительности. Там, где Delphi дает рыбу, С++ дает удочку.
И с этим тоже не спорю.
0 программистов ругал сердитый шеф,
потом уволил одного, и стало их FF!
Здравствуйте, zaiats_2k, Вы писали:
_>Здравствуйте, Sinclair, Вы писали:
S>>Здравствуйте, zaiats_2k, Вы писали: _>>>В моём тексте какжется было не совсем так, как вы цитируете: "((1 shl D) and SD)<>0)"... S>>То, как было у вас в тексте, не будет компилироваться, т.к. во-первых, в Паскале нет синтаксиса С-style cast, а во-вторых, приведение целого к boolean запрещено.
_>Ну ладно, ладно, я уже 3 года не писал на Дельфи, забыл. Там синтаксис такой boolean(I). И приведение не запрещено.
Зря вы так думаете.
...The previous remarks refer to the ordinality of Boolean values, not to the values themselves. In Delphi, Boolean expressions cannot be equated with integers or reals. Hence, if X is an integer variable, the statement
if X then ...;
generates a compilation error. Casting the variable to a Boolean type is unreliable, but each of the following alternatives will work.
if X <> 0 then ...; { use longer expression that returns Boolean value }
var OK: Boolean { use Boolean variable }
...
if X <> 0 then OK := True;
if OK then ...;
Delphi 7 Help.
... << RSDN@Home 1.1 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали: S>Зря вы так думаете. S>
S>...The previous remarks refer to the ordinality of Boolean values, not to the values themselves. In Delphi, Boolean expressions cannot be equated with integers or reals. Hence, if X is an integer variable, the statement
S>if X then ...;
S>generates a compilation error. Casting the variable to a Boolean type is unreliable, but each of the following alternatives will work.
S>if X <> 0 then ...; { use longer expression that returns Boolean value }
S>var OK: Boolean { use Boolean variable }
S> ...
S>if X <> 0 then OK := True;
S>if OK then ...;
S>Delphi 7 Help.
Да тут совсем не о том написано. Вот цитата из Language Reference касательно variable typecast:
You can cast any variable to any type, provided their sizes are the same and you do not mix integers with reals. (To convert numeric types, rely on standard functions like Int and Trunc.) Examples of variable typecasts include
In a value typecast, the type identifier and the cast expression must both be ordinal or pointer types. Examples of value typecasts include
Integer('A')
Char(48)
Boolean(0)
Color(2)
Longint(@Buffer)
The resulting value is obtained by converting the expression in parentheses. This may involve truncation or extension if the size of the specified type differs from that of the expression. The expression’s sign is always preserved.
The statement
I := Integer('A');
assigns the value of Integer('A')—that is, 65—to the variable I.
A value typecast cannot be followed by qualifiers and cannot appear on the left side of an assignment statement.
0 программистов ругал сердитый шеф,
потом уволил одного, и стало их FF!
Здравствуйте, The Lex, Вы писали:
TL>Начинать с нуля WinAPI, принципы работы с БД, C++ и "прочую лабудень" по-моему не стоит. WinAPI во-первых чрезмерно широк и имеет ряд довольно узких специализаций, а во-вторых по слухам предполагается быть упраздненным. Принципы работы с БД в VFP и других системах не особо отличаются. C++ — это вообще отдельная тема, тут я не могу ничего сказать.
TL>Тут вот меня просили "помочь изучить C++". Проект для изучения был о-очень оригинальный: БД на Postgress (так, кажется, пишется) с клиентами на Telnet или что-то такое — я точно не вник. Я попытался объяснить, что подобный проект проще, эффективнее, рациональнее и все такое, делать на Visual Basic, но... Наверное мне еще стоит поучиться риторике. Не знаю как вы, а я, например, просто в шоке от кода ADO под C++ . Вот в VB это просто очаровательно! Но в C++ — нет, увольте!
А мне так не показалось, нормальный код, если приглядеться. Я использую ADO и в VB, и в C++(VC),
шока нет. Выбор языка, ИМХО, зависит от того, сколько тебе заплатят, и сколько времени на разработку.
TL>Это, разумеется, мое скромное мнение, именуемое также ИМХО или IMHO — как кому больше нравится...
Борланд билдер против VC++ — это, что плотник супротив столяра (С)(А.П.Чехов — "Каштанка")
Здравствуйте, Patalog, Вы писали:
P>Здравствуйте Hacker_Delphi, Вы писали:
P>[skip] HD>>Дельфи — это "RAD System — Rapid application Development System" т.е. система быстрой разработки приложений. нигде не вижу слов про БД... странно... то, что они исхитрились встроить в систему быстрый удобный и универсальный движок работы с БД — честь им и хвала. То, что я видел кучи
P>Спорный вопрос... Особенно насчет удобный...
Целиком и полностью, BDE — это самый страшный грех Борланда перед человечеством
Здравствуйте, zaiats_2k, Вы писали:
S>>Возвращаясь к теме — речь шла о сравнении длин программ на С++ и на Pascal. При прочих равных выясняется, что длина кода в плюсах будет меньше, т.к. там можно перегружать операторы (а запись a+=b всегда короче, чем a:= Add(a, b)) и операторные скобки занимают в сумме 2 символа ({}) вместо 8 (begin/end). Единственное место, где Delphi лапидарнее — это ключевое слово with. Не думаю, что с его помощью удастся значительно сократить программу, т.к. для большинства его применений в С++ есть альтернативные методы, которые к тому же приводят к более читаемому коду.
_>Как тут уже правильно заметили — учить слепой десятипальцевый надо. И тогда длина кода на 15% большая не будет для тебя аргументом. Да и переменные перестанешь называть A, D и SD. ))
Не вижу смысла. Имеем два случая:
1. Я не умею печатать СДП (слепым десятипальцевым) методом — длина кода > на 15%. Время набора 1 символа, допустим == 1 сек. Набор 2х символов — за 2 сек., 8 — за 8 сек.
2. Я умею печатать СДП методом — и что, длина кода уменьшилась? Ну стал я писать 1 символ за 0.5 секунд, что изменилось? 2 символа — 1 сек., 8 — 4 сек.
Что я хочу сказать: при одинаковой скорости печати, главное не скорость, а количество.
Здравствуйте, Bigger, Вы писали:
B>Целиком и полностью, BDE — это самый страшный грех Борланда перед человечеством
А вот тут вы не правы. В свое время BDE был прорывом в технологиях. В 1992 году ODBC и рядом с ним не стоял. Впрочем, как и сейчас. Другое дело, что сейчас есть другие технологии доступа к разнородным данным. Которые являются развитием идей BDE. Так что BDE — это не грех Борланда перед человечеством, а заслуга.
Здравствуйте, Real 3L0, Вы писали:
R3> Не вижу смысла. Имеем два случая: R3>1. Я не умею печатать СДП (слепым десятипальцевым) методом — длина кода > на 15%. Время набора 1 символа, допустим == 1 сек. Набор 2х символов — за 2 сек., 8 — за 8 сек. R3>2. Я умею печатать СДП методом — и что, длина кода уменьшилась? Ну стал я писать 1 символ за 0.5 секунд, что изменилось? 2 символа — 1 сек., 8 — 4 сек. R3>Что я хочу сказать: при одинаковой скорости печати, главное не скорость, а количество.
Так уже не раз говорили, что на сам процесс написания кода у программиста уходит не так уж много времени (СДП еще больше уменьшает это время). Больше времени уходит на отладку, исследовании проблемы, эксперименты, чтение MSDN-а и форумов, чтение предыдуще написанного кода и т.д.