Здравствуйте, Lazy Cjow Rhrr, Вы писали:
M>>В чем же отличие.. ах да.. "*" и "+" намного сложнее воспринимаются чем multiply и add. Но я думаю к этому можно привыкнуть M>>Равно как и к замене <> на () LCR>Твои мысли удивительным образом пересекаются с LCR>The Nature of Lisp
говорили мне что это все очередной баян... придумали баян и радуются, а я не верил...
Здравствуйте, Геннадий Васильев
ГВ>Твой пример, кстати, иллюстрирует одну особенность REPL. Заменяется неактивный в данный момент объект. Обрати внимание на последовательность выделенных слов:
ГВ>
ГВ>Вначале вызываем метод hello у объекта t класса Test. Получаем то, что и было сразу реализовано в классе Test.
ГВ>Затем через eval расширяем класс(Стоп! В этот момент в нашем контексте нет активного обращения к t — Г.В.) Test и добавляем метод bye. Вызваем его у уже существующего объекта t. Получаем ожидаемый результат -- вызов нового метода.
Гена, ты не прав
Вот простейший пример модификации методом самого себя (из работающего проекта):
module So_4
class LibraryMode
include Singleton
...
def static?
static_mark_exists = File.exists?( '.so4.static' )
MxxRu.show_brief( "detecting SObjectizer-4 library mode: " +
"#{static_mark_exists ? 'STATIC' : 'SHARED'}" )
if static_mark_exists
Oess_1::LibraryMode.instance.force_static
else
Oess_1::LibraryMode.instance.force_shared
endself.class.class_eval %Q{ def static?; #{static_mark_exists}; end }
static_mark_exists
end
...
end
end
Метод static? должен отрабатывать только один раз -- когда его вызывают впервые. Он должен сделать свои действия, вычислить булевское значение, а затем возвращать его при последующих вызовах. В первый раз он делает именно это. А затем заменяет свое собственное тело для того, чтобы при последущих вызовах вообще ничего не делать.
Без модификации собственного кода потребовалось бы метод оформлять следующим образом:
def static?
return @static_mark_exists if nil != @static_mark_exists
...bla-bla-bla...
@static_mark_exists = ...bla-bla...
@static_mark_exists
end
или в более традиционной записи:
def static?
if nil == @static_mark_exists
...bla-bla-bla...
@static_mark_exists = ...bla-bla...
end
@static_mark_exists
end
А вот модификация приводившегося мной ранее примера. Только теперь объект t задействован на отдельной нити, которая в бесконечном цикле дергает его метод long_play:
require 'thread'class Test
def initialize
@restart = false
end
def hello
puts "Test#hello"end
def restart
@restart = true
end
def long_play
puts "Entering long play"
puts "calling hello..."
hello
until @restart
sleep 0.1
end
@restart = false
puts "Leaving long play"end
end
REQUIRE_REGEX = /require [\'\"]([^\'\"]+)[\'\"]/
CALL_METHOD_REGEX = /call ([[:alnum:]]+)/
EVAL_REGEX = /eval (.+)/
RESTART_LONG_PLAY_REGEX = /restart/
def exception_guard
begin
yield
rescue StandardError => x
puts x
end
end
t = Test.new
Thread.new do
while true
t.long_play
end
end
print "=>"
while line = gets.chop
if "quit" == line
break
elsif line =~ REQUIRE_REGEX
exception_guard do
require REQUIRE_REGEX.match( line )[ 1 ]
end
elsif line =~ CALL_METHOD_REGEX
exception_guard do
m = t.method( CALL_METHOD_REGEX.match( line )[ 1 ] )
m.call
end
elsif line =~ EVAL_REGEX
exception_guard do
eval EVAL_REGEX.match( line )[ 1 ]
end
elsif line =~ RESTART_LONG_PLAY_REGEX
t.restart
end
print "=>"
end
А вот результат работы (жирным я выделил наиболее важные моменты):
Entering long play
calling hello...
Test#hello
=>eval t.restart
=>Leaving long play
Entering long play
calling hello...
Test#hello # <= здесь отработал старый вариант t.hello
require 'test_modification' # <= обновление Test#hello
=>restart
=>Leaving long play
Entering long play
calling hello...
updated Test#hello
Test#hello # <= отработал новый вариант t.hello
require 'test_modification_long_play' # <= теперь заменяем сам Test#long_play
=>restart
=>Leaving long play # <= это конец старого метода.
*** This is new long_play method! *** # <= а вот это уже новый метод.
restart
=>*** Bye! ***
*** This is new long_play method! ***
eval class Test; def long_play; until @restart; sleep 0.1; end; @restart = false; end; end
=>restart
=>*** Bye! *** # <= после очередной замены доработал старый метод
restart # <= а вот новый метод ничего не делает.
Содержимое файла test_modification.rb:
module Sample
def something; puts "Sample#something"; end
end
class Test
alias :old_hello :hello
def hello
puts "updated Test#hello"
old_hello
end
include Sample
end
Содержимое файла test_modification_long_play.rb
class Test
def long_play
puts "*** This is new long_play method! ***"until @restart
sleep 0.1
end
@restart = false
puts "*** Bye! ***"end
end
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, LaptevVV, Вы писали:
LVV>Позволю себе не согласиться...
Да это сколько угодно
Я ведь свое впечатление высказал, не претендуя на истину в последней инстанции.
LVV>Дело не в способностях... Способности как раз практически одинаковые... Те самые — интеллектуальные... Но вот обучение в детстве, очевидно, происходило по-разному... Поэтому и СТИЛЬ МЫШЛЕНИЯ — разный...
Очень может быть. Да вот только меня 10-ть лет в школе учили русскому языку, а научить писать правильно так и не смогли (хотя иногда брались за меня в усиленном порядке). А вот C++-у никто не учил, а получается
Ну да не в этом суть. Не важно по каким причинам, но в каждой из областей есть выдающиеся личности. В программировании это, например, Дейкстра, МакКарти, Флойд, Вирт, Кей, Томпсон, Ричи, Страуструп, Гослинг, Джой, Столман, Уолл, ван Россум, Мацумото, Хальсенберг, Торвальдс, ... Имхо, иначе как элитой программистов их не назовешь. Лего считать "мы все в г..., а есть элита, которая вся в белом" старой банальностью, но лично моей фамилии в данном списке нет и не будет. Даже если я и не понят современниками
А что элитарности, то опять же, личные впечатления. Когда я учился в начале 90-x, то у профессии был некий ореол элитарности: "Ты на кого учишся?" -- "На программиста" -- "О, а это что, что-то по компьютерам?"
Даже в нашей среде термины "исскуственный интеллект", "экспертные системы", "распознавание образов" выглядели как "заумные" и люди, знавшие Lisp или Prolog вызывали уважение (хотя бы потому, что книг и документации по этим вещам не было, приходилось людям как-то выкручиваться и выискивать). И, что интересно, экспертные системы и системы распознавания образов (на Prolog-е с использованием Pascal и C++) в те времена писались и даже внедрялись (например, в некоторые наши больницы и институт радиоционной медицины), т.е. были реально восстребованы. Поэтому у нас, у студентов, был некий пиетет перед "матерыми программистами", поскольку мы с ними сталкивались (вели они у нас спец-курсы) и знали их профессиональный уровень.
Сейчас же практически все знают, что такое "программист". Компьютеры не диковенка. Экспертные системы сейчас кому-нибудь вообще нужны? (Здесь об этом Геннадий Васильев, кажется упоминал). Участь многих выпускников сейчас -- попасть в крупную оффшорную шарагу на сопровождение какой-нибудь корпоративной информационной системы, где придется Web-формочки править или SQL-запросы профилировать. Какая уж тут элитарность? Обычная работа, как раньше инженер у кульмана.
ИМХО, естественно.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
[...]
FR>Он подключится в момент присваивания, но старый метод (активный) не выгрузится пока из него не вернется управление, при этом если в этом старом есть рекурсия то будет вызыватся уже новый метод.
Да, я именно это и имел ввиду.
<< Под музыку: Blackmoore's Night — Greensleeves >>
<< При помощи Януса: 1.2.0 alpha rev. 650 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, eao197, Вы писали:
E>Гена, ты не прав E>Вот простейший пример модификации методом самого себя (из работающего проекта):
Да, согласен и свою неточность уже признал.
Но в сущности, ты показал как раз то, что я ожидал увидеть: чудес не бывает. Сначала управление должно покинуть старые методы, и лишь потом оно сможет попасть в новые.
Понимаешь, изменить ссылку на метод можно без особых проблем. Даже в C++. Сложно обеспечить непротиворечивость системы в переходный момент, если, скажем, перезагружается модуль с некотОрым количеством разных методов внутри. В идеале в это время управление не должно находиться в теле замещаемых методов. Вот это-то как раз самое трудное в горячей замене. Особенно, если модифицируемая система — не stateless.
<< Под музыку: Blackmoore's Night — Play, Minstrel, play >>
<< При помощи Януса: 1.2.0 alpha rev. 650 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Дарней, Вы писали:
ГВ>>Речь была не об основаниях, которые позволяют отнести себя к элите, а об её, элиты, взаимоотношениях с окружающими и сопутствующих тараканах.
Д>Для начала надо определиться, кто к этой группе относится. А потом уже думать об их взаимоотношениях
Так вот, люди, которые понимают сложные вещи в своей предметной области и составляют элиту.
Вполне возможно, что их кто-то не понимает. Хотя бывают многочисленные вариации на эту тему.
<< Под музыку: Blackmoore's Night — Magical World >>
<< При помощи Януса: 1.2.0 alpha rev. 650 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
ГВ>Так вот, люди, которые понимают сложные вещи в своей предметной области и составляют элиту.
Ну так я еще раз тебе скажу, что это определение крайне далеко от действительности. Программирование — это работа человека, который создает, а не что-то там "понимает"
ГВ>>Так вот, люди, которые понимают сложные вещи в своей предметной области и составляют элиту.
Д>Ну так я еще раз тебе скажу, что это определение крайне далеко от действительности. Программирование — это работа человека, который создает, а не что-то там "понимает"
А он хоть понимает, что создает? Или хотя бы осознает, что он делает?
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, Дарней, Вы писали:
Д>Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>
ГВ>>Так вот, люди, которые понимают сложные вещи в своей предметной области и составляют элиту.
Д>Ну так я еще раз тебе скажу, что это определение крайне далеко от действительности. Программирование — это работа человека, который создает, а не что-то там "понимает"
Конечно, у него же есть чёткая инструкция, по которой он всё создаёт, а думать и тем более понимать — ну нафиг не надо
ГВ>>Так вот, люди, которые понимают сложные вещи в своей предметной области и составляют элиту.
Д>Ну так я еще раз тебе скажу, что это определение крайне далеко от действительности. Программирование — это работа человека, который создает, а не что-то там "понимает"
Понимание прокладывает дорогу действиям. Как бы, никто и не сомневается, что создавать — необходимо. Беспокоят обычно другие вопросы: зачем, что и как. А ключ к ответу на них — понимание.
<< Под музыку: Blackmoore's Night — Magical World >>
<< При помощи Януса: 1.2.0 alpha rev. 650 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Дарней, Вы писали:
E>>А он хоть понимает, что создает? Или хотя бы осознает, что он делает? Д>понимание — это условие необходимое, но не достаточное
Угу. Ещё есть хотение. По-научному — мотивация.
<< Под музыку: Blackmoore's Night — Magical World >>
<< При помощи Януса: 1.2.0 alpha rev. 650 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Курилка, Вы писали:
Д>>Ну так я еще раз тебе скажу, что это определение крайне далеко от действительности. Программирование — это работа человека, который создает, а не что-то там "понимает"
К>Конечно, у него же есть чёткая инструкция, по которой он всё создаёт, а думать и тем более понимать — ну нафиг не надо
Не надо думать — с нами тот,
Кто все за нас решит.
Веселые — не хмурые —
Вернемся по домам...
<< Под музыку: Cruachan — Spancil Hill >>
<< При помощи Януса: 1.2.0 alpha rev. 650 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Понимаешь, изменить ссылку на метод можно без особых проблем. Даже в C++. Сложно обеспечить непротиворечивость системы в переходный момент, если, скажем, перезагружается модуль с некотОрым количеством разных методов внутри. В идеале в это время управление не должно находиться в теле замещаемых методов. Вот это-то как раз самое трудное в горячей замене. Особенно, если модифицируемая система — не stateless.
Вообще-то проблем с заменой кода я особых не вижу. А вот замена структур данных, которая может производится в момент замены кода -- вот это да, тот еще подарочек. Поэтому мне кажется, что REPL хорошо использовать для bug fixing-а в on-line. А вот upgrade лучше выполнять рестартом -- проще и надежнее. И вообще, оказывается, что принцип "fail fast, restart quickly" замечательно работает для обновления систем 24x7 -- быстрый рестарт, в момент которого происходит переход на новую версию ПО, оказывается всего лишь частным случаем общей схемы поведения системы.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, Дарней, Вы писали:
Д>Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>Угу. Ещё есть хотение. По-научному — мотивация.
Д>а помимо хотения есть еще умение Д>простое "понимание" в программировании — это то же самое, что "глубокая теоретическая подготовка в области секса"
В сексе думать (порой и теоретически) есть вещь далеко не маловажная, позволяющая достичь много большего
Здравствуйте, Дарней, Вы писали:
ГВ>>Угу. Ещё есть хотение. По-научному — мотивация. Д>а помимо хотения есть еще умение Д>простое "понимание" в программировании — это то же самое, что "глубокая теоретическая подготовка в области секса"
Ты имеешь ввиду ловкость попадания по Ctrl-Esc? Таки да, умение почти как в сексе.
<< Под музыку: Cruachan — Ride On >>
<< При помощи Януса: 1.2.0 alpha rev. 650 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Дарней, Вы писали:
E>>Интересно, выбор средств контрацепции к области секса относится?
Д>примерно настолько же, насколько умение заливать каток относится к умению играть в хоккей
Попытка не защитана: заливают катки и играют в хокей разные люди.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.