Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Правда. Владелец успешного стартапа и хороший программист — совсем не одно и то же. В смысле, это может быть один и тот же человек, но сие совсем не обязательно.
верно. это также может быть хороший менеджер (что правда встречается еще реже, чем хороший программист)
но мы ведь здесь о программистах говорим, не так ли?
да и вообще не вижу смысла в противопоставлении программист vs менеджер. Потому что хороший программист должен обладать навыками менеджера, чтобы уметь организовать свою работу. А хороший менеджер должен обладать техническими навыками в предметной области, чтобы эффективно управлять.
ГВ>>>Заблуждение. Гламурное к тому же. Д>>а давай без подонковской лексики?
ГВ> Где ты её нашёл?
а к чему ты вообще вставил здесь это слово? По смыслу оно совершенно неуместно.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>М-м-м... Следуя такой модели аргументации, я могу предположить, что следующим номером будет обсуждение на тему того, что не всякое зерно одинаково полезно, что не всякий амбар одинаково хорош, что не всякая мышь одинаково прожорлива, а некоторые крысы уничтожают мышей и потому могут быть полезны. Далее мы перейдём к обсуждению способов ловли мышей, пород кошек и моделей картофелеуборочных комбайнов.
ГВ>Понятно, что я ошибаюсь, ибо имеется бесконечное количество тем, связанных с этим
сообщением исключительно общей лексикой. Слова, то есть, похожи.
ты конечно прав. А не припомнишь, какое отношение противостояние "мышка vs ученый" имеет к теме обсуждения синтаксиса языков?
Здесь я даже связи по общей лексике не наблюдаю.
А что, прелесное дитя, с загнутыми в бабочау пальцами, ты сделал выдающегося в этой жизни?
<< Под музыку: silent >>
<< При помощи Януса: 1.2.0 alpha rev. 650 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Дарней, Вы писали:
ГВ>>Правда. Владелец успешного стартапа и хороший программист — совсем не одно и то же. В смысле, это может быть один и тот же человек, но сие совсем не обязательно. Д>верно. это также может быть хороший менеджер (что правда встречается еще реже, чем хороший программист) Д>но мы ведь здесь о программистах говорим, не так ли?
Мы здесь о распространёности Lisp говорим, если я не ошибаюсь.
Д>а к чему ты вообще вставил здесь это слово? По смыслу оно совершенно неуместно.
А мне показалось, что ты излишне приукрашиваешь действительность. Отсюда и "гламур".
<< Под музыку: silent >>
<< При помощи Януса: 1.2.0 alpha rev. 650 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Очень простой демагогический прием -- перевод на личность собеседника. Не удивительно, что именно ты любишь затем своих собеседников в демагогии обвинять.
Тем не менее, было бы интересно послушать твое мнение о сути вопроса: почему схожие приемы в двух языках программирования не приводят к описываемым тобой проблемам? Может быть по причинам, которые хорошо были описаны Sinclair-ом?
Итак: интересно знать, почему ты утверждаешь, что использование return-ов из блоков кода -- это проблема, а на практике этой проблемы нет.
Теперь о личном.
VD>>>Ага. А в С++ нет проблем goto, обращения к неинициализированным переменным и т.п. Достаточно послушать фанатов С++, чтобы убедиться что те у кого такие проблемы встречаются — это просто криворукие ламеры.
E>>Собственно, так и есть.
VD>Кто бы спорил. Ты один из них и есть.
Тогда тебя не затруднит привести примеры моего кода с использованием goto, неинициализированными переменными и проблемами, которые из этого вытекают. В противном случае можешь считать себя посланным по любому выбранному тобой адресу.
E>>Грабли видят (точнее, ощущают, те, кто на них наступают). Если смолторкеры говорят, что они программируют на SmallTalk и не натыкаются на эти грабли, а ты, не программируя на SmallTalk, говоришь, что видишь эти грабли...
VD>Если ты считашь, что не программируя на языке нельзя рассждать о фактах из этого языка, то это твои проблемы. Я так не считаю. Ну, уж раз ты так считашь, то в следующий раз когда начнешь рассуждать о макросах или еще чем-то вспомин свои слова и будь последователен.
Обязательно буду. Для начала нужно только подождать, чтобы на Nemerle написали столько же кода, как на SmallTalk и в мире было столько же Nemerle-стов, сколько SmallTalk-еров. Думаю, лет пять-десять у нас в переди еще есть.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, VladD2, Вы писали: VD>[c#] VD>internal class Wildcard
Я в курсе. У МС вообще в этом плане политика достаточно закрытая. Есть масса заинтерналенного кода, который был бы крайне полезен при написании приложений.
VD>И что ты показать хотел? То что кто-то сделал внутри библиотеки поля с прекомпилирвоанными регексами?
Что кто-то считает, что проще применять регекс как черный ящик. VD>Это как-то опровергает мои слова?
Нет. А ты думаешь, что все тебя только и хотят опровергнуть?
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Дарней, Вы писали:
Д>Здравствуйте, FR, Вы писали:
FR>>Плохие программисты могут быть неплохими бизнесменами, я как минимум пару таких знаю.
Д>вероятно, они одновременно могут быть также плохими каменщиками, авторемонтниками или гинекологами. Д>Но я не думаю, что нужно перечислять все области, в которых у человека нет талантов. Д>Хороший бизнесмен — этого уже вполне достаточно.
Это ты к чему? Мы же вроде про стартапы в IT? Тут в выигрыше как раз комбинация хоть какой то программист и одновременно хороший бизнесмен.
E>Блоки, созданные через Proc.new ведут себя так же, как блоки с ^ в SmallTalk (по крайней мере, насколько я понял из описаний смолтолкеров) -- применение в чужом контексте приведет к порождению исключения. Блоки, созданные через lambda, напротив, не прерывают работу вызвавшего их кода -- происходит возврат только из тела лямбды
Вот это гораздо интересней ST (имхо, конечно )
А можно вопрос — насколько часто применяется Proc.new? По сравнению с lambda? И есть ли вообще смысл в первом по ср. со вторым?
Здравствуйте, FDSC, Вы писали:
FDS>Здравствуйте, vdimas, Вы писали:
V>>Здравствуйте, Дарней, Вы писали:
Д>>>ответ очень прост — большие компании консервативны и неповоротливы, они не могут извлечь пользу из новых технологий. Но стартапы этим не страдают, и они давно бы воспользовались любой технологией, которая может дать им преимущество. Хотя бы малейшее.
V>>AutoCAD когда-то был весьма скромной программой. Им бы никто не дал хорошую расширяемую скрипт-машину по вменяемой цене на момент выхода, но зато написать интерпретатор Lisp-а способен даже студент-старшекурсник. (Примечание, VBA-среда появилась там уже в версиях, близких к 10-й, когда она стала вполне доступной по цене и наконец-то не такой уж глюкавой. Да и еще железки возмужали настолько, что стали адекватно переносить запуск среды редактирования VBA-макросов)
FDS>Да, я сам пользовался AutoCAD, но какие преимущества даёт САМ ЛИСП, а не его лёгкость написания? Мы же говорим про программирование на ЛИСП, а не про его написание. С этим никто не спорит (хотя, что знает, кто знает)
Ты не с той стороны смотришь, тебе как пользователю автокада глубоко пофигу на чём там что написано — лишь бы работало, а вот если бы ты был автором — было бы совсем иначе
А в данном топике важнее как раз точка зрения программиста как автора.
Здравствуйте, Beam, Вы писали:
B>Ну и повторюсь. Передача блока с возвратом в качестве параметра в метод, который не ожидает такого возврата, является логической ошибкой. С таким же успехом и в другом языке можно передать в метод неправильные параметры и нарушить работу системы.
Получается, что увеличивается связность компонентов, кроме просто определения метода, необходимо ещё для каждого блока знать, есть ли там возврат или нет, причём в определении этого метода это НЕ УКАЗАНО и нужно смотреть где этот блок создавался. Тут утверждают, что в ST методы маленькие, но толку от этого, если они обладают большей связностью? Хотя и больше гипотетической, конечно...
Здравствуйте, FDSC, Вы писали:
VD>>>Это возможно, но не элементарно.
ANS>>В каком-то частном случае — возможно. В общем — нет.
FDS>Приведите мне такой случай для языка со строгой статической типизацией.
_Ты_ и Влад сказали, что это возможно вы и приводите.
Здравствуйте, Beam, Вы писали:
B>Ну как же... Ведь на этапе определения слов и закладывается в них определенный смысл. Сейчас программист классы, методы и функции разрабатывает, а потом будет слова новые придумывать и описывать их смысл.
Язык с кучей слов давно есть называется forth
Кстати и DSL'ы на нем есть где почти естественным языком проблемы описываются.
Здравствуйте, FR, Вы писали:
FR>Здравствуйте, Beam, Вы писали:
B>>Ну как же... Ведь на этапе определения слов и закладывается в них определенный смысл. Сейчас программист классы, методы и функции разрабатывает, а потом будет слова новые придумывать и описывать их смысл.
FR>Язык с кучей слов давно есть называется forth
Здравствуйте, FDSC, Вы писали:
FDS>Здравствуйте, nostromo, Вы писали:
N>>В Smalltalk тоже нельзя прервать выражение. N>>Например: N>>
N>>SomeClass>>foo
N>>|a b|
N>> a := self bar. "возвращает что-то типа [:x | ^x + 42]"
N>> b := a value. "сюда мы уже не попадем, потому что предыдущая строка вызовет исключение"
N>> ...
N>>
N>>При попытке вызова этого метода в любезно предложенном отладчике мы увидим следующее (VisualWorks): N>>
N>>cannotReturn: value
N>> "Raise a signal which means that the reciever attempted to return
[code]
N>> (with the supplied value), but its sender cannot be returned into
N>> (e.g. sender is nil, probably because the receiver already returned).
N>> This message is sent by the execution machinery (the VM or some
N>> execution simulator such as a debugger)."
N>> CannotReturnError new
N>> context: self;
N>> parameter: value;
N>> raise
N>>
FDS>Не дошло, почему исключение было вызвано? Можно прокомментировать подробнее?
Исключение возникает при попытке выполнения оператора возврата внутри блока, помещенного в переменную a (в моих комментария выше есть ошибка, я исправился здесь
). Именно, приведенное выше сообщение cannotReturn: находится на вершине стека, а ниже лежит оператор возврата из блока. При этом в cannotReturn: в переменной self находится контекст метода bar, в котором sender=nil (это логично --- сообщение bar никто здесь не посылает), поэтому возврат из блока в данном случае вызывает исключение, а receiver --- собственно экземпляр класса SomeClass, которому послано сообщение foo.
Ситуация меняется, если блок определен в том же методе в котором вызвается. Пример здесь
Еще несколько слов о блоках и контекстах. Контексты могут быть вложенными:
y := 100.
x := 200.
block1 := [:x1 | [y+x1] ].
(block1 value: 3) value.
Последнее выражение вернет 103. Если вместо x1 написать x, то среда предупредит, что пременная x уже была определена вне блока, и, если оставить так, то при исполнении локальная переменная "закроет" доступ к внешней. Все равно вернется 103.
Кроме того, контексты не копируются, а передаются по ссылке:
FR>>Язык с кучей слов давно есть называется forth
К>Лисп не катит в эту категорию, хочешь сказать?
В лиспе главное скобки, в форте слова
Лисп конечно катит, но на форте писать DSL близкие к естественному (правда сильно императивному) языку проще, вернее большинство программ написанных в хорошем стиле так и делают.
Здравствуйте, FR, Вы писали:
FR>Это ты к чему? Мы же вроде про стартапы в IT? Тут в выигрыше как раз комбинация хоть какой то программист и одновременно хороший бизнесмен.
это я к тому, что хорошего бизнесмена (менеджера) найти еще посложнее, чем хорошего программиста. Поэтому странновато называть хорошего бизнесмена плохим программистом
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Мы здесь о распространёности Lisp говорим, если я не ошибаюсь.
Точнее — про то, что глупо объяснять малую распространенность языка тем, что кто-то его "не понял" или "не оценил"
Кому надо — те и поймут, и оценят. Пример Грэхема здесь вполне показателен.
ГВ>А мне показалось, что ты излишне приукрашиваешь действительность. Отсюда и "гламур".
А что, прелесное дитя, с загнутыми в бабочау пальцами, ты сделал выдающегося в этой жизни?
Ну так привел бы ссылки на свои проекты, список научных публикаций и так далее. Чтобы, так сказать, придать весомость своим словам. В чем проблема то?
А вместо этого какие-то мутные аллегории про мышей, зерно и так далее. Не понимаю
Здравствуйте, Курилка, Вы писали:
К>А можно вопрос — насколько часто применяется Proc.new? По сравнению с lambda? И есть ли вообще смысл в первом по ср. со вторым?
Proc.new применяется гораздо чаще. Просто потому, что обычная передача блока кода:
sample { return }
приводит к конструированию объекта Proc через Proc.new:
irb(main):001:0> def sample(&block)
irb(main):002:1> block.call
irb(main):003:1> end
=> nil
irb(main):004:0> sample { return }
LocalJumpError: unexpected return
from (irb):4
from (irb):2:in `sample'
from (irb):4
irb(main):005:0>
Лямбда используется гораздо реже. Насколько я помню, я использую ее именно в случаях, когда нужно в одном месте определить блок кода, который будет использоваться в дальнейшем каким-то другим объектом:
class Test
def initialize( &blk )
@blk = blk
end
def do_something
@blk.call
end
end
t = Test.new &lambda { puts "hello"; return }
t.do_something
Если в этом примере убрать &lambda, то при обращении к t.do_something произойдет LocalJumpError.
Так же lambda применяется для формирования блоков, которые будут использоваться в другой нити.
Но lambda все же встречается крайне редко. Есть, как минимум, два объяснения:
1) return в блоках кода приходится использовать эпизодически. В основном используется тот факт, что значением блока является результат последней выполненой в блоке операции. Поэтому нет необходимости делать return. Если уж надобность в return-е возникла, значит в блоке выполняются какие-то слишком сложные действия и лучше вынести их в отдельный метод. Поэтому и получается, что основными потребителями блоков являются методы типа each и inject (у коллекций), open у File и т.п., где блоки имеют довольно тривиальный вид.
2) когда блок кода используется для определения тела метода при помощи define_method (очень частый прием при метапрограммировании) нет разницы, через Proc.new или через lambda создается блок кода, поскольку он затем выполняется через instance_eval, а там чуть другие правила.
Надобность же с return в Proc может возникнуть. Например, в примере, аналогичном показанному Beam-ом