Здравствуйте, Дарней, Вы писали:
Д>Интересно, а тебе лично он много преимуществ дал? Или кому-то еще?
Лично мне он дал возможность взглянуть на программирование под другим углом.
Можно ли считать это преимуществом ? Но опыт был интересным.
... << RSDN@Home 1.1.4 Pink Floyd — Another Brick In The Wall Part 2>>
Здравствуйте, Vermicious Knid, Вы писали:
VK>VladD2, ты сильно на меня не сердись. Этот код можно было написать один-в-один, но без CPS. В Nemerle есть одна не очень хорошо документированная фича: VK>
ОК, это хорошая возможность, хотя, по-моему, с не очень очевидным синтаксисом.
Однако ее наличие упрощает применение CPS, но никак не отменяет его вовсе. В других языках, гед нет такой возможности, передача продолжения через параметр остается единственной возможностью.
В общем, смысл моего высказвания был в том, что CPS — это паттерн который можно применять практически в любом языке. И Смолток тут совершенно не причем.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, FDSC, Вы писали:
FDS>>Учтите, думать в нотации языка Pascal гораздо удобнее, чем в сишной, однако его клоны не так сильно распространены как си. Так что, возможно, дело в помочных эффектах
VD>Pascal и С — оба являются клонами Алгола/Фортрана. Так что учить один после другого не сложно. А выбор между ними — это выбор предпочтений.
Ага, однако программирование на них довольно сильно различается. Вообще говоря, просто думаешь другими понятиями. Да и если сравнить Фортран с C++, различия в синтаксисе довольно значимые. Я, например, испытывал затруднения, когда читал Фортрановские программы, зная C++ и Pascal, а вот C++ читал нормально, зная только Pascal.
VD>Смолток и Лисп другое дело. Именно об этом я и говорил когда рассуждал о традиционности.
VD>И мне забавно наблюдать как еденицы привыкшие к некому нетрадиционному синтаксису всеми силами пытаются навязать окружающим мысль о том, что этот синтаксис совершенно традиционен, аргументируя свое мнение тем, что у других гранаты другой системы.
Вы сами очень любите Nemerle, а его синтаксис (только не убеждайте меня, что он похож на C#, сам знаю) меня раздражает . Так что принципиально нет разницы между вами, говорящими что Nemerle лучше C# и людьми, говорящими, что Lisp лучше C.
Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>Здравствуйте, VladD2, Вы писали:
Д>>>>и почему нельзя использовать ее с привычным С-style синтаксисом?
ANS>>>можно. У java слишком большой синтаксический оверхед, а в C#2 всё нормально для этого.
VD>>Ну, так и в чем дело? Чем тогда C# 2.0 хуже?
ANS>Я забыл упомянуть про такую фичу ST-блоков как нелокальный возврат (non-local return). Её несколько раз упоминали в этом форуме, но внимание особо не заостряли. Этой фичи нет ни в C#2, ни в java. То есть "с привычным С-синтаксисом" — можно, но по сути в C#2 — нельзя.
ANS>Рассмотрим уже привычный нам пример:
ANS>
ANS>aValue := aDictionary at: aKey ifAbsent: [return nil].
ANS>... тут идёт, при котором aValue всегда имеет корректное значение ...
ANS>
ANS>Вместо пугающей "крышечки" я написал слово "return". Так вот, "возврат" выполняется не в контексте блока, а в контексте где блок определён. То есть выполнение команды "return" из анонимной функции в C#, или метода анонимного класса в Java возвращают управление в код, вызвавший эту функцию. А в ST происходит возврат из того метода, где был блок определён. Отсутсвие этой фичи делает невозможным реализацию аналога at:ifAbsent: в Java и C#.
Здравствуйте, Дарней, Вы писали:
ГВ>>Значит, фанатам майнстрима Lisp никаких преимуществ не даст. Ну-с, что и требовалось доказать. Д>Интересно, а тебе лично он много преимуществ дал? Или кому-то еще? Я пока не вижу кучу стартапов как у Грэхема, которые растут как грибы после дождя.
Знаешь, я сейчас очень хорошо почуял мотивы, которые двигают Win2K, когда он пишет свои резкие постинги. Отвечу почти копирайтом: не будет тебе органометрии. И темы для сплетен (это уже не тебе) — тоже не будет.
PS.: Вы задали хороший вопрос, коллега!
<< Под музыку: Gregorian — Moment Of Peace >>
<< При помощи Януса: 1.2.0 alpha rev. 650 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, VladD2, Вы писали:
VD>Если сравнить его с любым языком обладающим сопоставлением с образцом, то Смолток сольем по полной. Причем как по объему кода, так и по его понятности.
.
VD>Ты лучше объясни, что ты хочешь добиться этим кодом. А то я уверен, что если код примет опсмысленный вид, то его можно будет записать и короче, и понятнее и без каких-либо вывертов в язке.
Я хотел бы что-бы вместо вот этого ужаса из Януса:
if (!msgs.Tables.Contains("message"))
return 0;
DataTable msgTable = msgs.Tables["message"];
это не органометрия, это простое и вполне закономерное любопытство
есди некоторые экзотические языки дают такой офигенный выигрыш в производительности труда, то где же его результаты? Где расцветающие пышным цветом стартапы?
Здравствуйте, Дарней, Вы писали:
Д>есди некоторые экзотические языки дают такой офигенный выигрыш в производительности труда, то где же его результаты? Где расцветающие пышным цветом стартапы?
Причём тут стартапы?
<< Под музыку: Medley — Biddy Mulligan, Whiskey On A Sunday, German Clockwinder, Isn't It Grand Boys >>
<< При помощи Януса: 1.2
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Q>> Ибо мозги у меня нормальные и когда я читаю "если условие, то сделать то-то", это более понимаемо, чем "условие :ЕслиДа делать то-то".
ANS>Не спора ради, но чисто из интереса, а как ты читаеш конструкцию: ANS>
ANS>условие ? то-то : что-то;
ANS>
Что забавно, именно такая конструкция используется мною меньше всего! Да, ОЧЕНЬ ПОХОЖЕ на смоллток. Но это скорее приятное сокращение кода, нежели повсеместное правило языка.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Причём тут стартапы?
Ты не устаешь меня радовать. Я то думал, имя Грэхема тебе знакомо. А ты оказывается просто проигнорировал его, как и любой другой незнакомый тебе термин
ответ очень прост — большие компании консервативны и неповоротливы, они не могут извлечь пользу из новых технологий. Но стартапы этим не страдают, и они давно бы воспользовались любой технологией, которая может дать им преимущество. Хотя бы малейшее.
Поскольку я не вижу волны таких стартапов, построенных на "элитарных языках", я делаю простой вывод — все их преимущества высосаны из пальца.
Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>Вместо пугающей "крышечки" я написал слово "return". Так вот, "возврат" выполняется не в контексте блока, а в контексте где блок определён. То есть выполнение команды "return" из анонимной функции в C#, или метода анонимного класса в Java возвращают управление в код, вызвавший эту функцию. А в ST происходит возврат из того метода, где был блок определён. Отсутсвие этой фичи делает невозможным реализацию аналога at:ifAbsent: в Java и C#.
Это уже особенности семантики областей замыканий. В общем-то полезное свойство для некоторых вещей (подобная техника используется в Скале, там это называется анонимными замыканиями, если не ошибаюсь).
Однако в данном примере не думаю что все это действительно необходимо. Пример не полный по этому трудно понять что реально задумавалось. Если сделашь его более осмысленно можно будет сравнить его с тем как бы это написал я на другом языке.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Andrei N.Sobchuck, Вы писали:
Д>>Для этого должны быть какие-то веские причины. Приведенный тобой пример совершенно не убеждает. Ни по понятности, ни по краткости.
ANS>Тогда извини. ANS>Если ты уверен в том, что вместо одной операции лучше постоянно применять несколько более примитивных операций, то я не буду тебя переубеждать.
Вообще, я согласен с Дандреем. А ты вот апеллируешь к оппоненту, а не к фактам.
Применение "несколько более примитивных операций" слабо связано с языком. Оно скорее связано с тем как спроектирован класс.
Например, если создать наследника хэш-таблицы и реализовать в нем методы вроде:
/**
* Returns an optional value associated with the specified key.
*/public Get (key : 'a) : option ['b]
{
mutable value;
if (TryGetValue (key, out value))
Some (value)
else
None ()
}
public TryGetValue (key : 'a) : 'b * bool
{
mutable value;
if (TryGetValue (key, out value))
(value, true)
else
(value, false)
}
/**
* Returns value associated with the specified key or default value (null for
* referece type and result of parameterless constractor for value type).
*/public GetValueOrDefault (key : 'a) : 'b
{
mutable value;
ignore (TryGetValue (key, out value));
value
}
/**
* Returns value associated with the specified key or defaultValue.
*/public GetValueOrDefault (key : 'a, defaultValue : 'b) : 'b
{
mutable value;
if (TryGetValue (key, out value))
value
else
defaultValue
}
/**
* Returns value associated with the specified key or result of call getDefaultValue().
* The getDefaultValue() called only if key not exists in collection.
*/public GetValueOrGetDefault (key : 'a, getDefaultValue : void -> 'b) : 'b
{
mutable value;
if (TryGetValue (key, out value))
value
else
getDefaultValue()
}
То в прикладном коде можно будет использовать довольно лаконичные и выразительные конструкции. Например:
def lst = hashtab.GetValueOrGetDefault(someKey, () => List()); // List создатстся только если ключа нет.
lst.Add(...);
...
match (hashtab.Get())
{
| Some(1) => // что-то делаем
| Some(2) => // что-то делаем
| Some(x) => // что-то делаем с 'x'
| None => // ключа нет в хэш-таблице
}
или
def (value, exists) = hashtab.TryGetValue(someKey);
if (exists)
doSomethingWithValue(value)
else
doSomethingElse();
ANS> Тем более, что в C# всё равно нет альтернативы последнему. Но в этом случае я не понимаю, почему народ так радовался появлению foreach, using в С# если проще всё делать по старинке по кусочкам?
foreach и using упрощает выражение часто используемых задач. При этом не код получается очень понятным. Лично я зачастую предпочитаю foreach даже более коротким вариантам.
Ты же (точнее идеология Смолтока) прелагаешь ради укарачивания записи жертвовать понятностью. Мол ничего что немного раком, за-то короче.
Написать функцию IfAbsent() или IfNotExists() можно и на C#. Да, управление в ней будет возвращаться в ту же точку, но это не проблема для большинства случаев. Более того код будет более структурным, а стало быть предсказуемым. Собственно моя функци GetValueOrGetDefault() решение очень близкое. Только она преполагает возврат значения и добавление ключа в хэштаблицу если его там еще нет.
А теперь задумайся вот над чем. Краткость и выразительность кода может быть достигнута разными путями. Например, очень сильно краткость и выразительность можно повысить если использовать сопсоставление с образцом. Насколько я понимаю в Смолток такой возможности нет. Уже это делает Смолток далеко не лучшим выбором для тех кто гонится за краткостью и выразительностью.
В Nemerle я так же могу создать полный аналог твоего кода (с "return"-ом) с помощью макроса. Более того я могу создать и более сложные решения которые будут выглядеть очень просто и выразительно. Так что единственное по чему я это не буду делать — это потому что это не нужно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Дарней, Вы писали:
Д>потому что это не одна операция, а две, причем слабо связанных логически. То, что в смоллтоке их можно совместить в одну конструкцию, выглядит для меня скорее минусом чем плюсом.
Тут ты не прав. Исхдя из банальных принципов декомпозиции и устранение дублирующегося кода имеет смысль выносить группы операций в функции.
Вот только это не значит, что тут у Смолтока есть серьезные приемущества. Анонимые методы с замыканиями позволяют решить проблему в лучшем виде.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Все тут кое-что сделали в этой жизни,
Ага. Вот Win2k, например, пальцы от души погнул. Интересно, это новая реинкарнация Редуктора, или просто Лисп так сильно действует на тщеславие и понты?
ГВ> С характеристиками примитивности и ограниченности количество творений коррелирует слабо.
Серьезно? А я то думал, что есть обратная зависимость.
В общем, меня это не интересует. Но вот когда вижу понты и выпендреж аналогичный тем что демонстрирует Win2k, то сразу хочется спросить — "А что, прелесное дитя, с загнутыми в бабочау пальцами, ты сделал выдающегося в этой жизни?". Но сразу же думаю о том, что те кто действительно что-то делают обычно не занимаются дешевыми понтами. Ведь подобные понты — это детское самоутверждение. А человек чего-то достигший в жизни уже самоутвердился и относится к себе с уважением. Это заставляет его относиться с уважением и к другим. Они ведь тоже что-то сделали?!
ГВ>Для развлечения попробуй найти некую связь между понятием "основной поток" (mainstream) и, скажем, любимым мною высказыванием Н. Бора о бессмысленности голосования по теоретическим вопросам. Есть ещё куча подобных высказываний, которые принадлежат, естественно, отдельным личностям, а не "кодексу майнстрима".
Приведи, плиз, ссылку на "кодексу майнстрима". Очень любопытно почитать.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Mirrorer, Вы писали:
Д>>Интересно, а тебе лично он много преимуществ дал? Или кому-то еще? M>Лично мне он дал возможность взглянуть на программирование под другим углом. M>Можно ли считать это преимуществом ? Но опыт был интересным.
С этим вряд ли кто поспорит. Изучить Лисп хотя бы теоритически (прочесть книжку по нему) полезно в принципе.
Но вот ходить и рассказывать окружающим что они быдло и дебилы только потому, что предпочли Лиспу другой язык — это... даже не знаю как то назвать без оскорблений.
А Геннадий Васильев меня вообще радует. Сам являясь тепичным представителем мэйнстрима всячески пытается помочь унижению енр представителей. Мазохизм, однако.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
В общем, позиция твоя мне скорее понятна, но с ней я не согласен
VD> Только она преполагает возврат значения и добавление ключа в хэштаблицу если его там еще нет.
комментарий на полях: на этот случай в ST есть метод at:ifAbsentPut:
Здравствуйте, VladD2, Вы писали:
VD>Тут ты не прав. Исхдя из банальных принципов декомпозиции и устранение дублирующегося кода имеет смысль выносить группы операций в функции.
Если таких операций много — может быть. Но это можно сделать и не корежа страшным образом синтаксис.