Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, lse, Вы писали: lse>>Ни то, ни другое — не проблема. Первое лечится void* и приведением типов при обращении, второе — указателем на вложенный список. S>Вот этого не понял. Кто куда указатель? Обычный список — просто куча структур (data, next). Из скаляра ты список не построишь.
Тьфу, черт, не список, конечно, а массив. Его-то можно использовать? Все-таки я же не сказал, что весь С++ можно сахаром назвать, а только половину Массив указателей void*.
lse>>Только структура, полученная таким образом, и struct все-таки будут разными. Под struct-объекты память резервируется на этапе компиляции, это достаточно серъезное различие. Так что пример не катит, т к противоречит определению 1; т е struct — таки не сахар. S>Дело даже не в том, как резервируется память. А в том, что к членам такой "псевдоструктуры" нельзя обратиться по имени через точку.
По имени нельзя — по индексу можно. Ну да ладно, я же уже признал, что со структурой промахнулся.
Здравствуйте, Sinclair, Вы писали:
lse>>for, while, do...while, class, struct, определение функции (метода), вызов функции (метода) (с полной поддержкой стека), реализация виртуальных вызовов ... S>Ничего, кроме операторов цикла, через goto реализовать не удастся. lse>>все это можно реализовать полным по Тьюрингу набором — операторы присваивания (предполагающее, само-собой, наличия переменных), условного ветвления, перехода на метку. И согласно твоему определению, все это является сахаром. S>Нет. Сахар действует локально — он не приводит к переписыванию всей программы. Никаким goto ты не заменишь стейтмент, в котором определяется struct.
Рассуждение о struct и пропуск "for, while, do...while" можно считать, что они является сахаром для С, С++ и даже C#?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>всякие циклы пришли из структурного программирования. Специально доказывалось, что при наличии в языке структурных конструкций можно программировать без goto. И в данном случае наличие goto это низкоуровневая оптимизация, типа ассемблрной вставки. Без goto вполне себе можно жить.
Без стркутрного программирования, как в прочем и без циклов, тоже можно жить. Зачем тему то подменять? Тема была не о крутости циклов супротив готу, а о том как определить сахар.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Sinclair, Вы писали:
lse>>как это нет? if, goto, := — полная по Тьюрингу комбинация. S>Сахар не имеет никакого отношения к полноте по Тьюрингу. Мы же говорим о синтаксическом сахаре — когда один синтаксис является альтернативой другому.
Замечательно. Теперь потрудись учесть в своем определении термина "сахар" эту замечательную мысль. Или просто признай, что этот термин слишком сильно зависит от личного восприятия и не может служить базой для точных утверждений.
Если рассуждать логически, то "сахара" может быть два типа.
1. Вводится алиас для уже имеющейся фичи.
2. Вводится новая фунциональность которую раньше приходилось бы варажать реализацией некоторого паттерна (обещепринятого подхода).
О первом и говорить не чего. А второе это уже введение в язык новой идиомы. Те кто не проникся идиомой будут твердить, что это толко сахар. А те кто проникся будут утверждать, что это полезная фича, так как она позвляет поднять уровень абстракции.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, AndrewVK, Вы писали:
AVK>И то, что в некоторых случаях по конструкции switch компилятор C# порождает команду switch, чего ты никакими фокусами с if и goto не добъешься.
Ну, я сам ее реализую. И что? Функционал тот же. Производительность та же. Только тарах неимоверно больше.
Или это и есть такой критерий сахара. Все что не порождает тот же ИЛ не сахар. А что порождает — сахар? Тогда в том же Шарпе половина конструкций один фиг сахар. Но многие с этим не согласятся.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
AVK>>И то, что в некоторых случаях по конструкции switch компилятор C# порождает команду switch, чего ты никакими фокусами с if и goto не добъешься.
VD>Ну, я сам ее реализую. И что? Функционал тот же.
Синтаксический сахар это не когда функционал тот же, а когда результат компиляции идентичен. Абсолютно идентичен.
VD>Тогда в том же Шарпе половина конструкций один фиг сахар.
Какие то — безусловно сахар.
... << RSDN@Home 1.2.0 alpha rev. 725 on Windows Vista 6.0.6000.0>>
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, AndrewVK, Вы писали:
AVK>>И то, что в некоторых случаях по конструкции switch компилятор C# порождает команду switch, чего ты никакими фокусами с if и goto не добъешься.
VD>Ну, я сам ее реализую. И что? Функционал тот же. Производительность та же. Только тарах неимоверно больше.
VD>Или это и есть такой критерий сахара. Все что не порождает тот же ИЛ не сахар. А что порождает — сахар? Тогда в том же Шарпе половина конструкций один фиг сахар. Но многие с этим не согласятся.
Ну и что? Когда вы будете писать официальный стандарт Немерле, то минимальный набор базовых конструкций очевидно опишите в терминах трансляции в целевую платформу, а всяческие удобные макро-надстройки выразите через набор базовых примитивов языка. Последнее и будет синтаксическим сахаром.
Здравствуйте, VladD2, Вы писали: VD>Рассуждение о struct и пропуск "for, while, do...while" можно считать, что они является сахаром для С, С++ и даже C#?
for в С/С++/C# является очевидным сахаром для while.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, AndrewVK, Вы писали:
AVK>И то, что в некоторых случаях по конструкции switch компилятор C# порождает команду switch, чего ты никакими фокусами с if и goto не добъешься.
Здравствуйте, konsoletyper, Вы писали:
AVK>>И то, что в некоторых случаях по конструкции switch компилятор C# порождает команду switch, чего ты никакими фокусами с if и goto не добъешься.
K>А оптимизатор на что?
А оптимизатор в JIT встроен, а не в компилятор C#. И оптимизатор к синтаксису отношение имеет весьма опосредованное.
... << RSDN@Home 1.2.0 alpha rev. 725 on Windows Vista 6.0.6000.0>>
Здравствуйте, AndrewVK, Вы писали:
AVK>>>И то, что в некоторых случаях по конструкции switch компилятор C# порождает команду switch, чего ты никакими фокусами с if и goto не добъешься.
K>>А оптимизатор на что?
AVK>А оптимизатор в JIT встроен, а не в компилятор C#. И оптимизатор к синтаксису отношение имеет весьма опосредованное.
Ну, если оптимизатор чего-то не умеет — это беда оптимизатора. Программист должен иметь возможность писать так, как он захочет. В данном случае могли бы сделать нужную оптимизацию и тогда switch был бы чистейшим сахаром, да и то не самым лучшим. Вот pattern matching с guards — это уже мощный сахар, настолько мощный, что уже непонятно, что сахар — pattern matching или if/switch.
Вообще, непонятно, почему это я вынужден применять какую-либо конструкцию языка только для того, чтобы получить более быстрый код. ИМХО, конструкции языка для того и есть, чтобы при помощи них было удобнее выражать свою мысль. Ну, конечно должны быть исключения, как, например, массивы в Haskell. Но это действительно тот случай, который никакими высшими математиками не оптимизируешь. А расмознавание паттерна с if'ами и его более эффективная компиляция делается на раз.
Кстати, данную оптимизацию можно было бы включить в компилятор.
Здравствуйте, konsoletyper, Вы писали:
K>Ну, если оптимизатор чего-то не умеет — это беда оптимизатора. Программист должен иметь возможность писать так, как он захочет.
Это за ради бога. Но при чем тут синтаксический сахар?
K> В данном случае могли бы сделать нужную оптимизацию и тогда switch был бы чистейшим сахаром
Нет. Потому что оптимизатор не есть часть языка.
K>Вообще, непонятно, почему это я вынужден применять какую-либо конструкцию языка только для того, чтобы получить более быстрый код.
Потому что мир несовершенен.
K>Кстати, данную оптимизацию можно было бы включить в компилятор.
В компилятор можно, в описание синтаксиса нельзя.
... << RSDN@Home 1.2.0 alpha rev. 725 on Windows Vista 6.0.6000.0>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Синтаксический сахар это не когда функционал тот же, а когда результат компиляции идентичен. Абсолютно идентичен.
Он и будет идентичен в машинных кодах.
VD>>Тогда в том же Шарпе половина конструкций один фиг сахар.
AVK>Какие то — безусловно сахар.
Ну, вот ты и будешь спорить с себе подобными о том, что есть сахар, а что нет. И спор этот будет вечен.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, deniok, Вы писали:
D>Ну и что? Когда вы будете писать официальный стандарт Немерле, то минимальный набор базовых конструкций очевидно опишите в терминах трансляции в целевую платформу, а всяческие удобные макро-надстройки выразите через набор базовых примитивов языка. Последнее и будет синтаксическим сахаром.
Никто никогда не описывает языки "в терминах трансляции в целевую платформу". Его описывают набором правил. Ты не найдешь ни одной ссылки на платформу в стандарте Шарпа. И это правильно, так как он может быть реализован где угодно если есть рантайм удовлетворяющий спецификации CLS. Точно так же Немерле — это в первую очередь язык, а уж то, что он реализован поверх дотнета — это частный случай. В конце концов он и по верх Моно реализован.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
AVK>>Синтаксический сахар это не когда функционал тот же, а когда результат компиляции идентичен. Абсолютно идентичен.
VD>Он и будет идентичен в машинных кодах.
При чем тут машинные коды?
AVK>>Какие то — безусловно сахар.
VD>Ну, вот ты и будешь спорить с себе подобными о том, что есть сахар, а что нет.
Не буду.
... << RSDN@Home 1.2.0 alpha rev. 725 on Windows Vista 6.0.6000.0>>
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, deniok, Вы писали:
D>>Ну и что? Когда вы будете писать официальный стандарт Немерле, то минимальный набор базовых конструкций очевидно опишите в терминах трансляции в целевую платформу, а всяческие удобные макро-надстройки выразите через набор базовых примитивов языка. Последнее и будет синтаксическим сахаром.
VD>Никто никогда не описывает языки "в терминах трансляции в целевую платформу". Его описывают набором правил. Ты не найдешь ни одной ссылки на платформу в стандарте Шарпа. И это правильно, так как он может быть реализован где угодно если есть рантайм удовлетворяющий спецификации CLS. Точно так же Немерле — это в первую очередь язык, а уж то, что он реализован поверх дотнета — это частный случай. В конце концов он и по верх Моно реализован.
А чем "рантайм удовлетворяющий спецификации CLS" не целевая платформа? Я, собственно, это и имел в виду. Имеется некоторая стандартизированная модель исполнения, результатом компиляции является исполняемый код, удовлетворяющий спецификации этой модели.
Например, в рамках стандарта C# про оператор + для целых говорят predefined (runtime позаботится о сложении). А x += y для целых — это сахар для x = x + y. А вот для более сложных объектов это уже не сахар, поскольку имеет семантические последствия
The term “evaluated only once” means that in the evaluation of x op y, the results of any constituent expressions of x are temporarily saved and then reused when performing the assignment to x. For example, in the assignment A()[B()] += C(), where A is a method returning int[], and B and C are methods returning int, the methods are invoked only once, in the order A, B, C.