Здравствуйте, Mirrorer, Вы писали:
M>Есть подозрение что народ хочет увидеть такое применение монад, которое даст преимущество по сравнению с традиционным подходом.. M>То есть без монад — гемморой. А вот с монадами..
Я их понимаю, это очень похвальное желание, но я то тут при чём?
Безгеморройного применения монад они не увидят — вот без паттернов код геморройней же не становится. Просто паттерны облегчают нам нахождения решения в типовых ситуациях, поскольку фиксируют их. То же самое и паттерн "монада".
Здравствуйте, Mirrorer, Вы писали:
VD>>К сожалению не всегда все очевидно m, a, s и т.п. просто сбивают с толка. M>Эх.. Да, жаль сообщения редактировать нельзя.. Подправил бы. Но в целом не так уж важно.
Это хороший пример, почему на rsdn польтзователям нельзя редактировать сообщения. Ну подправил бы ты. А письмо Влада осталось. И кто потом это бы прочел, долго бы удивлялся о чем идет речь.
AndrewVK wrote: > M>Эх.. Да, жаль сообщения редактировать нельзя.. Подправил бы. Но в > целом не так уж важно. > Это хороший пример, почему на rsdn польтзователям нельзя редактировать > сообщения. Ну подправил бы ты. А письмо Влада осталось. И кто потом это > бы прочел, долго бы удивлялся о чем идет речь.
Поэтому надо хранить историю изменений и помечать к какой ревизии
относятся ответы.
M>Есть подозрение что народ хочет увидеть такое применение монад, которое даст преимущество по сравнению с традиционным подходом.. M>То есть без монад — гемморой. А вот с монадами..
Здравствуйте, GlebZ, Вы писали:
GZ>Стоп. Ты сам мне объяснял почему немерлавцам пришлось для реализации list comprehension залезть в компилятор. Попросю быть объективным.
Значит ты плохо слушал. Там используется $ который является очень перегруженным символом в Немерле. А сам list comprehension реализован в виде отдельного макроса.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, deniok, Вы писали:
D>Маленькая поправочка — в Хаскелле это не так.
...Таким же образом мы могли бы определить Int (целые фиксированного диапазона) и Integer:
data Int = -65532 | ... | -1 | 0 | 1 | ... | 65532 –- ещё псевдо-код
data Integer = ... -2 | -1 | 0 | 1 | 2 ...
где -65532 и 65532 – это максимальное и минимальное целое фиксированного диапазона в данной реализации. Тип Int представляет собой существенно более широкое перечисление, чем Char, однако по-прежнему конечное! В противоположность этому псевдо-код для типа Integer предназначен для описания бесконечного перечисления.
Думаешь вольность автора?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, deniok, Вы писали:
D>>Маленькая поправочка — в Хаскелле это не так.
VD>
...Таким же образом мы могли бы определить Int (целые фиксированного диапазона) и Integer:
VD>data Int = -65532 | ... | -1 | 0 | 1 | ... | 65532 –- ещё псевдо-код
VD>data Integer = ... -2 | -1 | 0 | 1 | 2 ...
VD>где -65532 и 65532 – это максимальное и минимальное целое фиксированного диапазона в данной реализации. Тип Int представляет собой существенно более широкое перечисление, чем Char, однако по-прежнему конечное! В противоположность этому псевдо-код для типа Integer предназначен для описания бесконечного перечисления.
VD>Думаешь вольность автора?
скорее демонстрация принципов работы "data". я такое и для паскаля видел
что касается встроенности в язык — то встроены только числовые литералы. остальное встроено в библиотеки и на дефиниции языка афаир никак не сказывается
Здравствуйте, VladD2, Вы писали:
VD>Значит ты плохо слушал. Там используется $ который является очень перегруженным символом в Немерле. А сам list comprehension реализован в виде отдельного макроса.
Однако факт остается фактом. Если средний пользователь захотел-бы реализовать list comprehension — то он бы этого не смог бы сделать. Так как нужно залезть в компилятор. Факт он такой, либо он есть, либо его нет. Нельзя быть чуть чуть беременным. Поэтому ты зря привел этот аргумент в пример.
Здравствуйте, GlebZ, Вы писали:
GZ>Фактически, это теоретическая возможность построения оптимизатора по сравнению с которым оптимизаторы императивных языков — дети неразумные. И собственно к этому все и движется. Только там слишком много NP задач. Во многом, это похоже на ситуацию с оптимизацией SQL.
AndrewVK wrote: > C>Поэтому надо хранить историю изменений и помечать к какой ревизии > C>относятся ответы. > Надо. Кто б еще этим занялся.
Так открыли бы исходники — народ бы подтянулся, ИМХО.
AndrewVK wrote: > C>Так открыли бы исходники — народ бы подтянулся, ИМХО. > Сомневаюсь
Ну так без исходников точно не потянутся.
Я бы лично немного помог родному RSDN. Просто я не вижу в чем такая
большая сложность в коде форума, в свое время я сам написал движок (на
С++ и CGI!), слегка подобный RSDN. Хотя может я чего-то и недооцениваю.
Здравствуйте, Cyberax, Вы писали:
C>Я бы лично немного помог родному RSDN.
На шарпе? Тогда этот вопрос можно решить индивидуально
C> Просто я не вижу в чем такая C>большая сложность в коде форума, в свое время я сам написал движок (на C>С++ и CGI!), слегка подобный RSDN. Хотя может я чего-то и недооцениваю.
Дело не в сложности, дело в необходимости потратить массу времени и усилий.
Здравствуйте, GlebZ, Вы писали:
GZ>Однако факт остается фактом. Если средний пользователь захотел-бы реализовать list comprehension — то он бы этого не смог бы сделать. Так как нужно залезть в компилятор. Факт он такой, либо он есть, либо его нет. Нельзя быть чуть чуть беременным. Поэтому ты зря привел этот аргумент в пример.
Не выдумывай. Вся реализация лежит в двух макросах. Все что делается в компиляторе — это разрешается неоднозначтьсть символа '$'. Если его заменить на любой друго, то проблем не будет. Сотсвбенно вот код: http://nemerle.org/svn/nemerle/trunk/macros/Util.n
public module ListComprehensionHelper
{
[Nemerle.Macros.Hygienic]
public ExpandRange (inrange : PExpr, acc : PExpr) : option [PExpr]
{
match (inrange) {
| <[ $pat in $[$first, $second .. $last] ]>
| <[ $pat in [$first, $second .. $last] ]> =>
Some (<[
mutable i = $first;
mutable delta = $second - i;
def last = $last;
mutable cond = if (delta < 0) i >= last else i <= last;
def pre_last = unchecked (last - delta);
when (delta < 0 && pre_last < last || delta > 0 && pre_last > last) // we overflowed
delta = -delta;
while (cond) {
def $pat = i;
if (delta < 0)
cond = i >= pre_last;
else
cond = i <= pre_last;
unchecked (i += delta);
$acc;
}
]>)
| <[ $pat in $[$first .. $last] ]>
| <[ $pat in [$first .. $last] ]> =>
Some (<[
mutable i = $first;
def last = $last;
mutable cond = i <= last;
mutable pre_last = last;
unchecked (pre_last--); // can't use (last - 1) since 1 might change/widen type
def overflowed = pre_last > last;
while (cond) {
def $pat = i;
if (overflowed)
cond = i >= pre_last;
else
cond = i <= pre_last;
unchecked (i++);
$acc;
}
]>)
| _ => None ()
}
}
}
macro ExpandListComprehension (params exprs : list [PExpr])
{
def adder =
<[
def cell = $(exprs.Head) :: [];
if (head == null) {
head = cell;
tail = cell;
} else {
_N_skip_write_check (tail.tl) = cell;
tail = cell;
}
]>;
def loops =
exprs.Tail.Rev ().FoldLeft (adder,
fun (e, acc) {
match (ListComprehensionHelper.ExpandRange (e, acc)) {
| Some (expr) => expr
| None =>
match (e) {
| <[ $e1 in $e2 ]> =>
<[ foreach ($e1 in $e2) $acc ]>
| cond =>
<[ when ($cond) $acc ]>
}
}
});
match (exprs) {
| [<[ $second .. $last ]>] =>
<[ $[ x | x in [$second .. $last]] ]>
| [<[ $first ]>, <[ $second .. $last ]>] =>
<[ $[ x | x in [$first, $second .. $last]] ]>
| _ =>
<[
mutable head = null;
mutable tail = null;
$loops;
if (head == null)
[]
else
head
]>
}
}
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.