<blockquote type="cite"><div>17 октября 2012 г., 12:29 пользователь Orlovsky Alexander <span dir="ltr"><<a href="mailto:nordicdyno@yandex.ru" target="_blank">nordicdyno@yandex.ru</a>></span> написал:<br /><blockquote style="margin:0 0 0 0.8ex;border-left:1px #ccc solid;padding-left:1ex;"><div><br />В Perl передать и вызывать то же каллбек можно только по ссылке :</div><div> </div><div>$cb = \&my_callback;</div><div>$cb->(%args);</div><div> </div><div>В Javascript функция передается как объект языка</div><div>и вызов ее потом выглядит более натурально (для того языка где пишется код):</div><div> </div><div>cb = my_callback; </div><div>cb(arg1, arg2);</div></blockquote><div>Что такое объект языка? И почему функции в perl не объекты языка?</div></div></blockquote><div> </div><div>что такое объект первого порядка языка (может по разному называться) </div><div>http://en.wikipedia.org/wiki/First-class_object</div><div>http://en.wikipedia.org/wiki/First-class_function</div><div> </div><div>В Perl сабрутины – это объекты языка по многим параметрам, но некоторые возможности, типа передачи по значению отсутствуют. (смотри таблицу во второй статье)</div><blockquote type="cite"><div><div> </div><div>"Каллбэки" являются ссылками во всех димнических языках. Или вы считаете, что cb = my_callback создает новую функцию? </div></div></blockquote><div> </div><div>Возможность манипулировать ссылками на функцию (Perl) и объектами-функциями (JS) – это немного разные вещи с точки зрения того как пишется и выглядит код.</div><div>(Как это реализовано под капотом в данном случае не важно.)</div><div> </div><div>Т.е. в том же JS  можно не заниматься разыменовыванием ссылок и получить более естественно (на мой вкус, например) выглядящий код:</div><div> </div><div>function func (num) { return num+2 }</div><div>var f = function () { return func };</div><div>var s = function (cb) { return cb(5) } </div><div>console.log( s(f()) )</div><div> </div><div>vs </div><div>sub f { $_[0] + 2 };</div><div>my $f = sub { \&f; };</div><div>my $s = sub { $_[0]->(5) };</div><div>print $s->($f->());</div><div> </div><div>в принципе в JS не все хорошо в плане boilrplate синтаксиса как видно выше, но в асинхронщине и функциональщине приятнее писать, как в первом варианте</div><div> </div><div>P.S.</div><div>я не фанат JS, но просто хотел объяснить свою мысль</div><div> </div><div>P.P.S.</div><div>мой пример синтетический )</div><div> </div><div>P.P.P.S.</div><div>Perl один из лучших динамических языков, по поддержке различных парадигм программирования, в котором можно делать все (если кто-то вдруг, кто подумает, что я это оспариваю). Higher Order Perl тому доказательство, например )</div>