Как вы относитесь к паскалю?
, (есть гипотеза)
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
| Страницы: (20) « Первая ... 14 15 [16] 17 18 ... Последняя » все ( Перейти к последнему сообщению ) |
Как вы относитесь к паскалю?
, (есть гипотеза)
|
Сообщ.
#226
,
|
|
|
|
Экстравагантно выглядит. Ссылочная семантика - она такая, да. Для сравнения: в Плюсах нет указателей на ссылки и как следствие массивов ссылок, т.к. семантически это неоднозначная конструкция.
|
|
Сообщ.
#227
,
|
|
|
|
Цитата Qraizer @ Экстравагантно выглядит. Ничего экстравагантного. И это не массив ссылок, а массив указателей. |
|
Сообщ.
#228
,
|
|
|
|
Цитата korvin @ И это не массив ссылок, а массив указателей. А мне вот тоже кажется, что к ссылкам ближе. Указатели - полноценный самостоятельный тип, со своими значениями и операциями. |
|
Сообщ.
#229
,
|
|
|
|
Цитата Добрый кот @ program Hello; {$APPTYPE CONSOLE} uses SysUtils; type t = class s: array of t; end; var t1: t; i,j,k: integer; begin { TODO -oUser -cConsole Main : Insert code here } t1.Create; end. Delphi 7. Компилится ![]() В целом согласен с Вами... Но всё же, академической строгости ради, должен заметить, что в тексте этой маленькой программы при компиляции - целых три предупреждения: о том, что i,j,k - лишние, а также - одна принципиальная ошибка: ![]() ![]() t1.Create Причем, что досадно, для в целом идеологически правильного примера, ошибка эта - одна из самых распространённых ошибок для начинающих (прекрасно понимаю - писалось второпях и без проверки компиляцией). На самом деле должно было быть: ![]() ![]() t1 := t.Create Ну и в конце, опять же для академической строгости, следовало бы добавить t1.Free ![]() ![]() program Hello; {$APPTYPE CONSOLE} type t = class s : array of t; end; var t1 : t; begin t1 := t.Create; t1.Free; end. Или, если не использовать t1 вообще, то можно было бы отказаться в данном случае и от var-секции: То есть использовать анонимный объект! ![]() ![]() program Hello; {$APPTYPE CONSOLE} type t = class s : array of t; end; begin with t.Create do try //... finally Free end end. Но в целом, повторю, с учетом исправления приведенных неточностей и ошибок - идеологически правильный пример! Более того, добавлю от себя, что все объявления передаваемых переменных ссылочных типов в заголовке функции/процедуры, через VAR/CONST/OUT-параметры, таких, например, как PChar, PInteger и т.д. (или таких, как объекты, которые по факту - также указатели), есть по определению ссылки-на-сылку, например: ![]() ![]() procedure TForm1.Button3Click(Sender: TObject); procedure Foo(var v : PChar); begin // здесь V передается как ссылка на ссылку, к которой прибавляется 3 - великолепный пример адресной арифметики в Паскале! if (v+3)^ <> 'D' // - если 4-ая буква в слове (третья начиная с нуля, на которую указывает p^) не равна 'D' then Caption := v // - вывести всё слово else Caption := v+3 // - вывести остаток строки, начиная с этой буквы end; var p : PChar; begin p := 'ABCDEF'; Foo(p) end; Я уж не говорю про классические Паскалевские цепочки неопределённой длины (указатель-на-указатель-...-на указатель): ![]() ![]() type PMy = ^TMy; TMy = record Num : integer; Next : PMy end; var p : PMy; ... И далее, после соответствующих инициализаций допустимо: P^.Next^ P^.Next^.Next^ P^.Next^.Next^.Next^ и т.д. или, опуская символ (^): P.Next.Next.Next что допускается современным синтаксисом при соблюдения условия однозначности трактования ситуации компилятором. И введено это правило для классов (вместо объектов), но распространяется на прочие указатели. Кстати, именно поэтому в примере выше - там где речь идет о (v+3)/(v+3)^ - опускать этот символ (^) нельзя! Потому что: ![]() ![]() (v+3)^ - это сам 4-ый символ (v+3) - это остаток строки, начиная с этого 4-го символа Так что замечание об экстравагантности ссылок-на-ссылки, по крайней мере для Паскалей - это скорее всего взгляд с "другого берега", приверженцев другого языка... |
|
Сообщ.
#230
,
|
|
|
|
Ну и так, вдогонку, хохмы ради (Холивар у нас, в конце концов, или где!):
![]() ![]() procedure TForm1.Button1Click(Sender: TObject); var a : PChar; b : PPChar; // - стандартный, между прочим, тип, определенный в модуле System c :^PPChar; begin a := 'ABCDEF'; b := @a; c := @b; Caption := b^; Caption := b^+2; Caption := b^^; Caption := c^^; Caption := c^^+2; Caption := c^^^; end; Особенно доставляет вот эта строчка: Caption := c^^^ - Это я про "экстравагантность ссылок-на-ссылки" и прочие "весьма компетентные" суждения Си-шников о Паскале/Дельфи! |
|
Сообщ.
#231
,
|
|
|
|
Цитата D_KEY @ А мне вот тоже кажется, что к ссылкам ближе. Креститься надо, когда кажется. =) ![]() ![]() data Ptr a = Ptr a | Nil data Ref a = Ref a ![]() ![]() var x : TObject; x := nil; Ок? Добавлено Цитата Barklay @ Я уж не говорю про классические Паскалевские цепочки неопределённой длины (указатель-на-указатель-...-на указатель): Они не паскалевские. Это стандартная реализация односвязного списка. |
|
Сообщ.
#232
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ А мне вот тоже кажется, что к ссылкам ближе. Креститься надо, когда кажется. =) ![]() ![]() data Ptr a = Ptr a | Nil data Ref a = Ref a ![]() ![]() var x : TObject; x := nil; Ок? Нет, не ок. nil/null не основное отличие ссылок от указателей(хотя в C++ оно существенно). В той же scala, например, null просто является экземпляром bottom-типа ссылочных типов - Null Основная разница между ссылками и указателями заключается в том, что указатели представляют собой самостоятельный полиморфный тип, со своими значениями(адреса) и операциями(адресная арифметика, разыменование). |
|
Сообщ.
#233
,
|
|
|
|
Цитата Barklay @ А вот не надо путать ссылки и указатели. Компетентные Си-шники в курсе разницы. В отличие от компетентных в Паскале/Дельфи, как они это уже много раз демонстрировали. - Это я про "экстравагантность ссылок-на-ссылки" и прочие "весьма компетентные" суждения Си-шников о Паскале/Дельфи! |
|
Сообщ.
#234
,
|
|
|
|
Цитата D_KEY @ Основная разница между ссылками и указателями заключается в том, что указатели представляют собой самостоятельный полиморфный тип, со своими значениями(адреса) и операциями(адресная арифметика, разыменование). Это языко-специфичное отличие. В "типобезопасных" языках никакой адресной арифметики нет и быть не может, а разыменовывание выполняется автоматически (что может привести к NullPointerException например). Так что, имхо, если имеет смысл различать эти понятия, то только с позиции типизации. Как, например, в C++ и Kotlin. |
|
Сообщ.
#235
,
|
|
|
|
Цитата korvin @ В "типобезопасных" языках никакой адресной арифметики нет и быть не может, а разыменовывание выполняется автоматически Поэтому там ссылки, а указателей нет. Добавлено Цитата korvin @ В "типобезопасных" языках никакой адресной арифметики нет и быть не может Чем принципиально адресная арифметика отличается от индексации? Если нужно проверять валидность индекса, то можно проверять и выход указателя за диапазон выделенного под массив блока. Добавлено Цитата korvin @ Так что, имхо, если имеет смысл различать эти понятия, то только с позиции типизации. Ну вот что, например, означает ссылка на ссылку и имеет ли она смысл? Для указателей указатель на указатель на указатель - вполне нормальное дело |
|
Сообщ.
#236
,
|
|
|
|
Цитата D_KEY @ Поэтому там ссылки, а указателей нет. Если бы они были non-nullable, были бы ссылками и никаких NullPointerException не возникало бы в принципе. Цитата D_KEY @ Чем принципиально адресная арифметика отличается от индексации? Тем что в ряде языков адресами управляет GC, да и без него обращение к произвольнольному адресу что по-твоему должно означать? Цитата D_KEY @ Чем принципиально адресная арифметика отличается от индексации? Если нужно проверять валидность индекса, то можно проверять и выход указателя за диапазон выделенного под массив блока. Ну и зачем тогда эта самая адресная арифметика, если уже есть индексация? Цитата D_KEY @ Ну вот что, например, означает ссылка на ссылку Она означает ссылку. Как сумма нулей, как произведение единиц. Цитата D_KEY @ и имеет ли она смысл? Практический — нет. И в приведенном делфийском коде нет ссылок. |
|
Сообщ.
#237
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ Поэтому там ссылки, а указателей нет. Если бы они были non-nullable, были бы ссылками Ты сейчас говоришь, что в той же Java есть указатели? Правильно я тебя понял? И ты так и не ответил на аргументы мои относительно null. С чего ты взял, что ссылка не может быть null'ом? Добавлено Цитата korvin @ Ну и зачем тогда эта самая адресная арифметика, если уже есть индексация? Потому, что она является более общей концепцией и напрямую подводит к понятию итареторов, которые, в свою очередь, фактически обобщают понятие указателя. |
|
Сообщ.
#238
,
|
|
|
|
Цитата D_KEY @ Ты сейчас говоришь, что в той же Java есть указатели? Правильно я тебя понял? Угу, правильно. Даже название исключения на это намекает. Цитата D_KEY @ И ты так и не ответил на аргументы мои относительно null. С чего ты взял, что ссылка не может быть null'ом? Ты не задавал этого вопроса. Потому что тогда: 1) она не будет отличаться от указателя, 2) ее придется правильно разыменовывать (ну или точнее проверять адрес), и 3) никакой неоднозначности: Цитата Qraizer @ в Плюсах нет указателей на ссылки и как следствие массивов ссылок, т.к. семантически это неоднозначная конструкция. не будет. Но я помню, что Qraizer как раз вроде показывал пример, как можно получить NULL-ссылку в плюсах. Или память меня подводит. И какой должен быть логический смысл у NULL-ссылки? Цитата D_KEY @ Потому, что она является более общей концепцией Вот те раз. А то, что оператор [] можно перегрузить и таким образом получить обощенный способ доступа по индексу к любому типу коллекций, в т.ч. и связным спискам, которые вообще как попало размещаются в памяти, не считается? Или они взаимозаменяемы? Смогу я по связному списку пройтись с помощью адресной арифметики? Добавлено Цитата D_KEY @ итареторов, которые, в свою очередь, фактически обобщают понятие указателя. Итераторы-то каким образом обобщают указатели? Добавлено Цитата korvin @ Цитата D_KEY @ Ты сейчас говоришь, что в той же Java есть указатели? Правильно я тебя понял? Угу, правильно. Даже название исключения на это намекает. Единственное, на что я могу согласиться (в качестве компромиса =)), так это, что 1) указатели в C, 2) ссылки в C++ и Паскале (которые var, const) и 3) объекты в Java, Delphi, etc — это три разных механизма. 3–й занимает промежуточное место между 1–м и 2–м. Добавлено http://programmers.stackexchange.com/quest...rom-a-c-pointer |
|
Сообщ.
#239
,
|
|
|
|
Цитата korvin @ Я говорил о семантической неоднозначности. Вот есть у меня...Потому что тогда: 1) она не будет отличаться от указателя, 2) ее придется правильно разыменовывать (ну или точнее проверять адрес), и 3) никакой неоднозначности: Цитата Qraizer @ в Плюсах нет указателей на ссылки и как следствие массивов ссылок, т.к. семантически это неоднозначная конструкция. не будет. ![]() ![]() int x; int& y1 = x; int&&y2 = y1; // предположим; на самом деле такого синтаксиса в языке нет. Цитата korvin @ Приводил. Но как пример дерьмостайла. Но я помню, что Qraizer как раз вроде показывал пример, как можно получить NULL-ссылку в плюсах. Или память меня подводит. И какой должен быть логический смысл у NULL-ссылки? |
|
Сообщ.
#240
,
|
|
|
|
Цитата Qraizer @ На что ссылается y2? На y1 или x? Если первое, то y2, являясь псевдонимом y1, даёт доступ к значению y1, что противоречит основополагающему свойству ссылок. Если второе, то зачем сия конструкция, если она полностью аналогична обычной ссылке? Второе, я ж написал. Цитата Qraizer @ Но как пример дерьмостайла. Это да, просто вдруг D_KEY будет настаивать именно на технической, принципиальной возможности. =) |