109: (Default)
[personal profile] 109
грамотный текст обо всём понемногу: http://gaperton.livejournal.com/23719.html?style=mine

единственное, что у меня вызывает сомнения, это полезность ассёртов. написать assert(A) немногим быстрее, чем if (!A) throw new AException, однако же второе лучше во всех отношениях.

(no subject)

Date: 2008-10-23 11:36 pm (UTC)
From: [identity profile] gaperton.livejournal.com
> ну то есть получается, что для предусловия эксепшены, если они есть в используемом языке, всегда лучше ассёрта?

Получается похоже именно так, и даже если их в языке нет, то все равно предусловия надо проверять в релизе, и сигнализировать об их нарушении как-нибудь аккуратно. Кодами возврата, например.

> а что в эрланге сделает функция вычисления sqrt от отрицательного числа?
либо исключение бросит, либо, что для квадратного корня в случае эрланга более предпочтительно, вернет ошибку. Язык-то динамический, можно что угодно возвращать. А вот если результат-ошибка не сматчится (то есть, если вызывающий код не ожидает получить ошибку, а ждет именно числа - то есть рассчитывает на good case), то все равно вылетит исключение. Которое, будучи не пойманным, завалит процесс, в котором это работает (штатная ситуация), о чем узнают связанные с ним процессы, и предпримут необходимые меры.

Пример - как можно открывать файл. Как-то вот так:
{ ok, File } = file:open( "name" ).

ok - это константа в данном случае, и если первый элемент тупла-результата вызова open будет не ok, а например, error - то вылетит исключение bad match.

Учитывая, что процессы в эрланге применяются примерно так же, как объекты в С# (их могут быть сотни тысяч в системе легко, и для полноты картины представьте, что каждый из них обрабатывает сообщения асинхронно на собственном треде), и полностью изолированны друг от друга, это создает интересные возможности.

(no subject)

Date: 2008-10-23 11:51 pm (UTC)
From: [identity profile] gaperton.livejournal.com
А выглядеть сигнатура sqrt может примерно так:

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)
From: [identity profile] 109.livejournal.com
о, круто! таплы возвращаются! а какой синтаксис внутри, чтобы тапл вернуть? (на эрланге начать писать, что ли? есть эрланг.нет?)

(no subject)

Date: 2008-11-17 12:50 pm (UTC)
From: [identity profile] gaperton.livejournal.com
Под .NET есть весьма прогрессивный F#, который сейчас стал одним из официальных языков платформы :). Там и туплы, и сопоставление с образцом. Легкой многозадачности и процессов построенных на сообщениях правда нет, зато можно обернуть асинхронные вызовы, чтобы они выглядели синхронно. Хороший язык. Если под .NET, то я бы предпочел его.

Чтобы вернуть тупл - достаточно написать { expr1, expr2, ..., exprN }. И все - тип данного выражения - тупл. Кажется в F# это должно выглядеть так: ( expr1, expr2, ..., exprN ).

Вообще - синтаксически формирование структуры и ее разбор на компоненты (матчинг) выглядят одинаково, вся разница в том, с какой стороны от присваивания стоит выражение. Это касается не только туплов, но и как минимум списков (которые в квадратных скобках).

(no subject)

Date: 2008-11-18 07:29 am (UTC)
From: [identity profile] 109.livejournal.com
хм, а что же его визуальная студия не поддерживает, если это один из языков платформы? в нотепаде, что ли, писать?

(no subject)

Date: 2008-11-18 01:21 pm (UTC)
From: [identity profile] gaperton.livejournal.com
Почему не поддердивает? Поддерживает. Тока надо отдельно качать.

Profile

109: (Default)
109

March 2019

S M T W T F S
     12
3456789
101112131415 16
17181920212223
24252627282930
31      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags