[программистское]
Oct. 20th, 2008 10:06 pmграмотный текст обо всём понемногу: http://gaperton.livejournal.com/23719.html?style=mine
единственное, что у меня вызывает сомнения, это полезность ассёртов. написать assert(A) немногим быстрее, чем if (!A) throw new AException, однако же второе лучше во всех отношениях.
единственное, что у меня вызывает сомнения, это полезность ассёртов. написать assert(A) немногим быстрее, чем if (!A) throw new AException, однако же второе лучше во всех отношениях.
(no subject)
Date: 2008-10-23 11:36 pm (UTC)Получается похоже именно так, и даже если их в языке нет, то все равно предусловия надо проверять в релизе, и сигнализировать об их нарушении как-нибудь аккуратно. Кодами возврата, например.
> а что в эрланге сделает функция вычисления sqrt от отрицательного числа?
либо исключение бросит, либо, что для квадратного корня в случае эрланга более предпочтительно, вернет ошибку. Язык-то динамический, можно что угодно возвращать. А вот если результат-ошибка не сматчится (то есть, если вызывающий код не ожидает получить ошибку, а ждет именно числа - то есть рассчитывает на good case), то все равно вылетит исключение. Которое, будучи не пойманным, завалит процесс, в котором это работает (штатная ситуация), о чем узнают связанные с ним процессы, и предпримут необходимые меры.
Пример - как можно открывать файл. Как-то вот так:
{ ok, File } = file:open( "name" ).
ok - это константа в данном случае, и если первый элемент тупла-результата вызова open будет не ok, а например, error - то вылетит исключение bad match.
Учитывая, что процессы в эрланге применяются примерно так же, как объекты в С# (их могут быть сотни тысяч в системе легко, и для полноты картины представьте, что каждый из них обрабатывает сообщения асинхронно на собственном треде), и полностью изолированны друг от друга, это создает интересные возможности.
(no subject)
Date: 2008-10-23 11:51 pm (UTC)sqrt( X, Epsilon ) when X >= 0, Epsilon > 0 -> ...типа реализация
Все, этого достаточно. Если вызовут с неправильными аргументами, опять вылетит bad match. А можно написать так:
sqrt( X, Epsilon ) when X >= 0, Epsilon > 0 -> ...типа реализация
sqrt( _, _ ) -> error.
Тогда вместо вылета bad match будет возвращен error.
(no subject)
Date: 2008-10-24 12:01 am (UTC)(no subject)
Date: 2008-11-17 12:50 pm (UTC)Чтобы вернуть тупл - достаточно написать { expr1, expr2, ..., exprN }. И все - тип данного выражения - тупл. Кажется в F# это должно выглядеть так: ( expr1, expr2, ..., exprN ).
Вообще - синтаксически формирование структуры и ее разбор на компоненты (матчинг) выглядят одинаково, вся разница в том, с какой стороны от присваивания стоит выражение. Это касается не только туплов, но и как минимум списков (которые в квадратных скобках).
(no subject)
Date: 2008-11-18 07:29 am (UTC)(no subject)
Date: 2008-11-18 01:21 pm (UTC)