Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2011, 21:06   #181
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
что-то вроде:
Код:
using(auto f=new File("1.txt"))
{
    //code
}
в using шапке можно лишь обьявлять переменные(через запятую) создавая/инициализируя их, если все созданы нормально, то блок перейдет внутрь, а если нет...
хм, думаю полезно может оказаться чтото вроде else для using(эта часть обсуждаема)
Только сейчас обратил внимание, что вы изобрели let и letrec из функциональных языков . Почитайте про эти формы - там их несколько вариаций и это не спроста. При циклах и рекурсии могут возникать неудобства. Поэтому прежде чем вводить такой механизм обратите внимание как это сделано в других языках (и почему так сделано).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 18.12.2011, 21:34   #182
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
2Пепел Феникса, А как Вы собираетесь реализовать автовывод типов и перегрузку функций вместе? Как генерическую функцию? Тогда что с примитивными типами, вроде int? Будут генерироваться специализированные ф-ции для примитивов, или параметры будут упаковываться? В любом случае, я против автовывода, так как это, как правило, сильно замедляет компиляцию.
ровно так же как работает auto в С++ и var в C#.
отличие в том что компилятор будет стараться вывести типы автоматически так же для параметров(если не указаны явно).
если не справляется, то выдаст ошибку.
на времени компиляции это скажется незначильно.
Цитата:
И ещё кое что. Уверены ли Вы по поводу отсутствия уборщика мусора? Мне кажется, ссылочная семантика и отсутствие уборщика мусора плохо скажутся на простоте контроля над памятью.
сборщик будет, но с возможностью ручного контроля(небольшого), это возможность включает в себя лишь возможность уменьшить счетчик ссылок/освободить переменную раньше конца блока.
Цитата:
И есть ли реальная необходимость в decltype, если нет шаблонов?
есть генерики, а не шаблоны(различия надеюсь не нужно обьяснять?)
Цитата:
за callbyname функции
а что это? можно примерчик?
Цитата:
возможность определения неизменяемых переменных
const,readonly?
Цитата:
кортежи
а можно примерчик этого? я не очень понимаю что это...
Цитата:
Не вижу смысла в п. 14, п. 18
абстрагирование от архитектуры.
Цитата:
и Обдумывание.п.2.
я тут сам 50 на 50, с виду и удобно, а с другой, очень уж не привычно.
Цитата:
Только сейчас обратил внимание, что вы изобрели let и letrec из функциональных языков . Почитайте про эти формы - там их несколько вариаций и это не спроста. При циклах и рекурсии могут возникать неудобства. Поэтому прежде чем вводить такой механизм обратите внимание как это сделано в других языках (и почему так сделано).
я не имею опыта с функциональными ЯП.
можно ссылку на подробное описание этих конструкций?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.12.2011, 21:51   #183
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Есть немного в 4-м выпуске журнала http://procoder.info/index.php/articles/04/128-sheme1
Точнее смотреть надо в английском варианте.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 18.12.2011, 22:20   #184
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
ровно так же как работает auto в С++ и var в C#.
отличие в том что компилятор будет стараться вывести типы автоматически так же для параметров(если не указаны явно).
если не справляется, то выдаст ошибку.
на времени компиляции это скажется незначильно.
Я к тому, что будет сгенерировано в таком случае:
Код:
func(a, b) {
  return a + b;
}

func(1, 2);
func("Hello, ", "World!");
Тут есть некоторые проблемы, а именно: как определить функцию, как генерическую (и таким образом придётся упаковывать целые числа, что скажется на производительности), или определить две функции (одна для примитивных типов, другая для объектов); Необходимо определить, что для a и b существует оператор +, что в случае генерической (а не шаблонной) функции весьма затруднено, ведь информация о типе поступает во время исполнения.
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
сборщик будет, но с возможностью ручного контроля(небольшого), это возможность включает в себя лишь возможность уменьшить счетчик ссылок/освободить переменную раньше конца блока.
Хм, уборщик на основе подсчёта ссылок имеет известные проблемы как с производительностью, так и с циклическими ссылками, что отлично видно в реализациях C++ и Vala (unique_ptr, weak_ptr ...). Но ладно, допустим. В таком случае, действительно ли необходима возможность контроля над счётчиком ссылок? Довольно опасная вещь.
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
есть генерики, а не шаблоны(различия надеюсь не нужно обьяснять?)
Вот именно, зачем в генериках decltype? Ведь вся типизация откладывается до рантайма, а для других случаев есть auto.
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а что это? можно примерчик?
Это функция, которая откладывает вычисление параметров до первого их использования. Удобного, например, для assert'ов или debug'ов
Код:
callbyname void assert(bool cond, string msg) {
  if (assertsEnabled)
    if (cond) // Тут произойдёт вычисление LongComputation
      throw new AssertFailureError(msg);
}

assert(LongComputation(), "assertion failed");
Другими словами, LongComputation как бы попадает в лямбду типа () => LongComputation; и не будет вызван до вызова этой лямбды.
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
const,readonly?
Да, то что в шарпе звётся readonly
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а можно примерчик этого? я не очень понимаю что это...
Это как неименованные структуры(tuples)
Код:
(string, int) replaceAll(string s, char from, char to) {
  int count = 0;
  ... // заменяем все символы в строке s с подсчётом кол-ва замен
  return (new_string, count);
}
...
auto t = replaceAll("string", 't', 'r');
println(t.1, t.2);
auto (s, c) = replaceAll("string", 't', 'r');
println(s, c);
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
абстрагирование от архитектуры.
Можно объявить указатели нерекомендованным стилем, но иногда они бывают удобны. Как, например, в D, их практически никогда не используют, но иной раз они просто незаменимы.
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
я тут сам 50 на 50, с виду и удобно, а с другой, очень уж не привычно.
Это удобно в функциональных языках (в Haskell есть эта конструкция), потому что там всё есть выражение и не может быть последовательности выражений в пределах одной функции (исключая do-нотацию, конечно же, но это всё равно не то), так что для читабельности приходится разбивать выражения на подвыражение в таком виде. А в императивных языках, где есть переменные, в этом нет особой необходимости.
netrino вне форума Ответить с цитированием
Старый 18.12.2011, 23:01   #185
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Необходимо определить, что для a и b существует оператор +, что в случае генерической (а не шаблонной) функции весьма затруднено, ведь информация о типе поступает во время исполнения.
это можно сделать и во время компиляции, хоть и чуть труднее, чем в рантайме, хоть и реально + я отлично представляю это себе.
Цитата:
как определить функцию, как генерическую (и таким образом придётся упаковывать целые числа, что скажется на производительности), или определить две функции (одна для примитивных типов, другая для объектов)
явно указав что она генерическая(тогда так же явное указание типов).
примитивные типы тоже объекты, конечно при возможности это будет оптимизировано, но это уже иной разговор.
Цитата:
В таком случае, действительно ли необходима возможность контроля над счётчиком ссылок?
контроль лишь в сторону уменьшения(причем на один, не более), что позволит уничтожить объект раньше конца блока(причем дальше ссылаться на этот объект уже никак, да и компиль может это отследить во время компиляции)
Цитата:
Другими словами, LongComputation как бы попадает в лямбду типа () => LongComputation; и не будет вызван до вызова этой лямбды.
обычно параметры итак вычисляются при вызове функции, потому как то не вижу разницы.
Цитата:
Это как неименованные структуры(tuples)
ну об этом подумаю.
Цитата:
Это удобно в функциональных языках (в Haskell есть эта конструкция), потому что там всё есть выражение и не может быть последовательности выражений в пределах одной функции (исключая do-нотацию, конечно же, но это всё равно не то), так что для читабельности приходится разбивать выражения на подвыражение в таком виде. А в императивных языках, где есть переменные, в этом нет особой необходимости.
пожалуй, логично.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.12.2011, 23:49   #186
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
обычно параметры итак вычисляются при вызове функции, потому как то не вижу разницы.
Я имел ввиду, что если в моём примере assertsEnabled == false, то LongComputation() не будет вычислено.
В остальном, главное, что Вы всё это хорошего представляете, посмотрим со временем, может что-то хорошее получится)
И кстати, может быть будет интересно, в D (и ещё некоторых языках) есть интересная фича, называемая scope-guard, выглядит это примерно так:
Код:
void fn(string s) {
  Object obj = malloc (sizeof(Object)); // небезопасное выделение памяти, или какого-либо неавтоматического ресурса

  scope (exit) {
    println("Exit");
    free (obj); // эта строчка выполнится обязательно по завершению ф-ции
  }

  scope (success) { // если мы достигли конца ф-ции
    println("Everything is O.K.");
  }

  scope (failure) { // если мы не достигли конца ф-ции (вышли по исключению)
    println("Error occured");
  }

  // ... работа с obj
}
Вот, правда, это довольно грубый пример, тем не менее, идея должна быть понятна. scope (exit) будет выполнено при выходе из текущей области видимости, scope (failure) только в том случае, если мы выходим с исключением, scope (success) в ином случае. Удобно для освобождения ресурсов и всего прочего в таком духе. Безусловно, того же эффекта можно достичь используя try/catch/finally, но так выглядит красивше)
netrino вне форума Ответить с цитированием
Старый 18.12.2011, 23:55   #187
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

делегирование внутрь...хм интересный вариант.

scope guard как то не красивы
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.12.2011, 00:04   #188
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
scope guard как то не красивы
Ну тут каждому своё, с этим не поспоришь))
Но по моему это красивей, чем
Код:
void fn(string s) {
  Object obj = malloc (sizeof(Object));
  bool exceptionOccured = false;

  try {
    // работа с obj
  } catch (Exception e) {
    println("Error occured");
    exceptionOccured = true;
  } finally {
    if (!exceptionOccured) {
      println("Everything is O.K.");
    }
    println("Exit");
    free (obj);
  }
}
Или удобно в таком случае:
Код:
bool call (Object obj, string s) {
  BSTR sz = SysAllocString(s.c_str());
  scope (exit)
    SysFreeString(sz);
  return obj.call(sz);
}
В это случае sz освободится по выходу из функции, но после вызова obj.call
Впрочем, это вам уже решать
netrino вне форума Ответить с цитированием
Старый 19.12.2011, 05:42   #189
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
это очень читабельно?
Да.
Цитата:
по вашим темам пока все что я видел это потерю указателя
Ну - да, пока бывает и такое что я допускаю ошибки. Со временем пройдёт но так или иначе, всё равно мне нужна такая возможность.
Цитата:
2_-Re@l-_, C++09 не существует. decltype официально принят в C++11.
С++ 09 не существует?! Чёйта вдруг? Он был , есть и будет.
_-Re@l-_ вне форума Ответить с цитированием
Старый 19.12.2011, 07:14   #190
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Необходимо определить, что для a и b существует оператор +, что в случае генерической (а не шаблонной) функции весьма затруднено, ведь информация о типе поступает во время исполнения.
Функциональное программирование показывает, что это заблуждение. Автовывод типов позволяет определить получаемые типы еще до исполнения, а значит генерить те функции, которые будут задействованы.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
можно ли подобный текст перевести на человеческий язык? alexxx777 Помощь студентам 0 24.05.2010 19:56
Как создать вид подобный SolidWorks. KemanSR Общие вопросы C/C++ 6 04.05.2010 21:30
Добавить модуль в phpnuke-подобный движок Able2Know Фриланс 3 23.04.2010 16:29
В Access есть тип данных "Счетчик".Есть ли подобный тип данных в MS Sql Server 2000? An_ton SQL, базы данных 5 16.01.2009 17:55