> Гвидо не раз просили сделать полноценные лямбда-функции, на что он справедливо замечал: если функция состоит больше, чем из одной строчки, у неё должно быть имя. Толково выбранное имя функции - прекрасная документация, оно позволяет сразу понять, что эта функция делаят, и сильно облегчает чтение кода.
Мегастрёмная отмазка!
Если бы была нормальная лямбда можно было бы легко реализовывать конструкции типа with-open-file.
На питоне это бы могло выглядить как-то так так:
with_open_file("blah", "r"
lambda(file):
do_foo_with_file(file)
do_bar_with_file(file))
Хотя смотриться кривовато, можно бы конечно по этому случаю было бы ввести ещё какой-нибудь синтаксис...
Ыгы вместо того чтобы сделать нормальную лямбду, лучше добавить новое ключевое слово (которое решает только одну из проблем отсутсвия нормально лямбды) и конечно же реализовано через зад:)
Лямбда не нужна. Пишу на питоне уже давно и много. Лямбдой пользовался только в первые месяцы освоения языка, больше по привычке. В основном в конструкциях типа filter(lambda s: s > 0, my_list). Потом открыл для себя list comprehensions и скоро обнаружил, что лямбдой больше не пользуюсь. Как и функциями filter, map и прочей реликтовой функциональщиной. list (и iterator) comprehensions - это прекрасная находка, они покрывадт 95% всех случаев возможного применения анонимных функций. А для остального, как уже сказали, обычных именованных функций больше, чем достаточно.
Пожалуйста. mod_parser, по видимому, не существует (хотя я давно не...), работал через CGI.
Писать очень приятно - стройный синтаксис, ориентированный именно на Web. Скажу даже, это единственный язык, ориентированный на веб, встречавшийся мне.
Все дело в выводе. А именно: если строка не начинается с идентификатора функции или вызова функции, она считается html кодом. Поэтому чистый HTML код, пропущенный через компилятор Parser, останется неизменным. Сооветственно, никаких <?php > и т.п. Если нужен вывод функции - просто в нужном месте вызываем ее, прямо в тексте. Это, скажу я вам, красота.
Объектная модель вполне на уровне PHP, не углублялся в нее сильно, поскольку мне вполне хватает такой :) Хотя не помню что там вместо $this. Кажется... $this :)
По произвоительности - ну компилятор, куда деваться. Работает быстро. Доказано Yandex.ru. Хотя опять же, простор для оптимизации есть.
Типизации данных нет. Глобальные переменные работают как в PHP с отключенным registerglobals (то есть, как и положено - все наружные в $HTTP_VARS, все внутренние - глобальны).
Отдельная вкусность - автоматическое определение DocumentRoot и автоматическая сборка из подкаталогов. Последнего не видел нигде и это главная фишка Parser.
Из минусов отмечу пожалуй только крайне малую распространенность.
Можно ознакомиться с моей CMS на Parser - она крайне не закончена, потому как ее концепция устарела, но тем не менее как пример кода можно посмотреть.
> В объектно-ориентированом языке руби функция - это не объект.
Ты что, больной? Тебе же написали, что это объект. Объект класса Proc. Чтобы его выполнить, ты можешь этот блок загребти в переменную. И у тебя эта переменная будет ссылаться на объект типа Proc. Чтобы выполнить тело полученной объекта-функции нужно вызвать метод call.
Млять, да, в Питоне и ПХП можно взять и просто забодяжить две скобки (). И оно выполниться. Но в питоне и пхп ООП соответствующее...
Да блин, вообще, для справки, блоки чаще всего используются для итерации, выполнении груповых операций типа мап, фильтр и т.п. В Руби все методы используются таким образом.
Например для открытия файла можно просто его открыть, а можно с блоком, тогда в блоке нужно записать все манипуляции с файлом. А за самим блоком файл уже будет закрыт. Ну что, программисты, есть такое в Питоне?
Если бы в питоне была нормальная лямбда (да и в пхп тоже), вообще про это никто бы не спорил. Но этого же попросту нету! Один оператор, а нет - то великий Гвидо знает, что блять, если мне не хочется делать лишнюю функцию, которая будет одна и непонятно нахрена.
И что это вообще за доебка? Не нравится call? Насчет смалтолка повторюсь, вчера смотрел синтаксис вроде штука прикольная. Во всяком случае интересная. Но с ним никто и не сравнивает. Я, например, его не юзаю ибо негде.
Для Руби появился некий простор в вебе и среди Перла/Питона/Пхп это самый гибкий и гармоничный язык. Если вы знаете только питон, а на руби программировали только по комментам с лора, то о чем вообще может идти спор? Вы же не в теме?
Конкретные претензии господа и будут конкретные ответы. А быдлокомменты - типа, мне млять вот это говнецо не нравится, это, блять, слив. Потому что я вообще молчу про ахилесову пяту змеи - отступы. А кто говорит, что это не так, пусть напишет комманд-лайн скрипт на змее, в одну строчку, вот тогда и поговорим... Хотя на самом деле идея неплохая и я просто показываю как можно доипаться на ровном месте.
> Потому что я вообще молчу про ахилесову пяту змеи - отступы. А кто говорит, что это не так, пусть напишет комманд-лайн скрипт на змее, в одну строчку, вот тогда и поговорим...
Тебя обманули, дурачог. Это не ахиллесова пята, а величайший прорыв в истории скриптовых языков. А однострочечники на полэкрана писать - удел фанатов недоязыков. Простые ребята питонисты запускают ipython и работают по-человечески.
>Можно ознакомиться с моей CMS на Parser - она крайне не закончена, потому как ее концепция устарела, но тем не менее как пример кода можно посмотреть.
Да уж...действительно...гм..."крайне". Там "Index of /" =)
Но до кода я все-таки добрался: у них на сайте есть руководство. Судя по первым двум главам, он заточенный даже не просто "под web", а под табличную верстку :). Не, я не против, понятное дело, практики делали, для работы, ориентируясь на современные реалии...Или мы с моим мозгом что-то путаем? :)
p.s. да, и еще одно: не совсем въехал, что есть "автоматическая сборка из подкаталогов"?
Ты слышал когда-нибудь про декларативное и императивное программирование? Знаешь чем они отличаются?
Я тебе расскажу. В императивном тебе приходится всегда придумывать старый велосипед и твой мозг постоянно пробуксовывает на старых задачах. Через некоторое время он уже этого не замечает, но ресурс используется.
Я формулирую задачу. Простую. Чтобы понятно было. Есть массив - нужно получить квадрат его элементов. Когда решение выполняется на Руби, я знаю метод map (кстати, если в Питоне ООП, то почему map фунцкия, а не обращение к методу?? :))) ).
Заметь. Я не думаю над тем, КАК МНЕ ПРОЙТИ и выполнить это действие. Я просто знаю, что для этого нужен метод map. И я пишу это одной строкой:
[1,3,8,2,8].map {|v| v*v}
Заметь, мне не пришлось трахать свой мозг комприхеншеном над тем как это выполнить. Я сразу выполнил нужное действие. Это называется не выполнять рутинных задач. Теперь я подумал, что неплохо бы выбрать среди этих элементов, те, что больше 10.
[1,3,8,2,8].map {|v| v*v}.filter {|v| v > 10}
Заметь, мне не пришлось обрывать эту цепочку и вводить промежуточные переменные. Я просто продолжил дальше используя декларативный код.
И тут я решил вывести получившееся на экран:
[1,3,8,2,8].map {|v| v*v}.filter {|v| v > 10}.each {|v| puts v}
Заметьте, господа анонимусы. Я сделал цепочку из нужных мне действий. Написал все это в декларативном стиле и при этом не ипал себе мозк деталями реализации.
Теперь внимание. Вопрос. Напишите пожалуйста этот код на Питоне и докажите, что лист комприхеншн это есть декларативное, а не императивное программирование. Но особенно интересует код на питоне :)))). Если вы не ответите, считается что в данном забеге Руби победил безоговорочно.
> Последняя новость - повод для оптимизма: "According to new waves and ideas in programming, parser-blade conception becomes archaic. I will start new project of next generation CMS soon."
Да-да, я ее уже начал и закончил. Только вот за большие деньги и пока без GPL.
> Это не ахиллесова пята, а величайший прорыв в истории скриптовых языков.
Ты наверное слеп на один глаз, брат анонимус. Я же написал дальше, что отступы штука нормальная (правда с табами он таки протупил), просто доипаться до особенностей языка можно всегда.
> Ну так что там про with-open-file? А также про все те места где нужно заданный код выполнить между одним кодом и другим??
Пиши обычную функцию и не выпендривайся. Если функция делает что-то сложнее a+1, у неё должно быть имя. А то задрали эти безымянные лямбды на полэкрана.
> Если функция делает что-то сложнее a+1, у неё должно быть имя.
Гвидо сказал, что это плохо - мальчег запомнил и теперь всем говорит, что это плохо. Только вот я не понимаю, зачем давать имя действию которое выполняется один раз и нигде больше не дублируется? Объясни мне? Зачем мне придумывать название для того, что я не хочу называть???
Потому что один голландец решил за всех что будет так? Так может пусть он идет лесом? А я буду делать так как считаю нужным, а не так как он считает нужным??
> Только вот я не понимаю, зачем давать имя действию которое выполняется один раз и нигде больше не дублируется? Объясни мне? Зачем мне придумывать название для того, что я не хочу называть???
Эатем, чтоб другие понимали, что именно делает твоя быдлофункция. Или ты все функции называешь f1, f2, f3, а переменные a1, a2, a3?
> Пиши обычную функцию и не выпендривайся. Если функция делает что-то сложнее a+1, у неё должно быть имя. А то задрали эти безымянные лямбды на полэкрана.
аргх. Какие вы таки не понятливые. Лямда здесь вообще не причём. Нельзя офомить код как в руби в блоке. Если бы в лямбде можно было иметь несколько строчек, она бы заменила блок. Если бы в питоне было нормальное метапрограммирование тоже бы не понадобилось. Но самый простой способ добавить конструкции аля with-open-file - сделать многостроковую лямбду.
> Пиши обычную функцию и не выпендривайся.
Кстати если бы это было наглядно и удобно то все бы так и деали но я
что то не помню чтобы где-нибудь был то-же with_open_file или with_GL.
Пришлось бы писать:
def foo(file):
do_foo_with_file(file)
do_bar_with_file(file)
with_open_file("blah", "r", foo)
СОВСЕМ НЕ НАГЛЯДНО. И убивает всю идею о блоках.
Чем тебе не блок кода? С тез пор, как в питоне появились вложенные функции, лямбда стала не нужна. Или ты тоже из тех, кто не умеет давать вещам имена?
Чем тебе не блок кода? С тез пор, как в питоне появились вложенные функции, лямбда стала не нужна. Или ты тоже из тех, кто не умеет давать вещам имена?
Одним словом хочется немного подытожить, и высказать пару мыслишек.
PHP сейчас, к сожалению, очень распространный. Мне было трудно сперва понять этот феномен, поскольку буквально по всем позициям он сдает Python'y, Ruby, Perl'y. PHP не есть язык программирвания общего назначения, поскольку это препроцессор, хотя есть попытки использования его для системного программирования, но имхо это изврат. Могу сходу привести пачку его недостатков: - это препроцессор, а не полноценный язык - все функции встроены в язык - нет неймспейсов (модулей) - регистронезависим - хеши и массивы – одно и то же – неоптимально и не удобно - в основном процедурный подход, хуже ООП, нет ФП - нет эксепшнов с трейсбеками - нет многопоточности в принципе, т.к. это препроцессор - компиляция в байт код только в процессе выполнения - страдает скорость - нельзя скрыть исходник однако, средства для этого продаются компанией Zend за $$$ - обладая возможности встраиваться в HTML-код поощряет перемешивания логики веб-приложения с оформлением. - нет возможности интерактивного шелла. - не опенсорс
Однако если подумать, начинаешь понимать, почему он так популярен. Действительно, он создавался, как более простой Perl. На этом и акцентируют внимание создатели для привлечения в ряды разработчиков PHP. Но вместе с тем он потерял и все его сильные стороны. Спрашиваетя, зачем тогда было оставлять $ в имени переменной. В перл хоть это имело значение, ибо там скаляры($), массивы(@) и хэши(%). Здесь же этого нет, но $ остался (предполагаю для более легкого синтаксического разбора :) - т.е. разработчики языка облегчили работу себе, но не программистам PHP) В Python'е и Ruby то этого нет :) Даже регулярные выражения (где Perl просто невъебенно крут) PHP имеет и свои (ereg_match) и от перла (preg_match) - ибо круты. По моему, это какой то невежественный язык... А популярен он потому, что так невежественнен. Ибо ориентирован на новичков в программирвании.. Но зато есть дофига случаев когда напыхтевшись на пхп люди переходили на что то вроде Python и назад уже ни ногой, ибо это небо и земля.
Отрадно, что новые языки типа Python, Ruby хоть еще и не так распространены, но постепенно набирают силу. Python сейчас можно охарактеризовать как сформировавшийся качественный изящный мощный язык, имеющий свою философию, многократно зарекомендовавший себя в разных областях применения. Ruby - молодой новаторский, пусть еще не совсем цельный, но тоже идейный язык, стремительно набирающий популярность. Как показывают споры в этом треде, конкуренция в данном случае идет между Python и Ruby, php тут и рядом не валялся. И это вобщем не плохо, ибо конкуренция в данном случае работает на качество.
Будем надеятся, что эти (и другие, если появятся, и будут лучше) языки и далее будут набирать популярность и в области веба, вытесняя посредственность и заурядность :))
> Нельзя офомить код как в руби в блоке.
def stupid_function():
foo()
bar('lalalal')
something_completely_different(1 + 1)
Чем тебе не блок кода? С тез пор, как в питоне появились вложенные функции, лямбда стала не нужна. Или ты тоже из тех, кто не умеет давать вещам имена?
> С тез пор, как в питоне появились вложенные функции, лямбда стала не нужна.
Если она не нужна, тебя же не затруднит выполнить быдло пример, который я написал выше без лямбды. Тем более что она куцая и годится только для одного действия? :)
Напомню пример:
[1,3,8,2,8].map {|v| v*v}.select {|v| v > 10}.each {|v| puts v}
Описание, смотри выше.
> Или ты тоже из тех, кто не умеет давать вещам имена?
Я из тех, кто не называет ненужное нужным. Каждый день я пользуюсь носками, но я не называю свои носки Васями, Петями и Олями. Они просто носки и я не хочу думать над тем как их называть.
Упс. Ну тогда да не укладываеться это просто так в лист комприхэншс.
[write(v) for v in map(expt2, [1,3,8,2,8]) if v > 10]
> И чего это ты Пит, за питонистов примеры пишешь?
А я на всём пишу:) Так что пофиг. Мне вот например питоноские (верней хаскелевское) лист коприхэншнс нравяться в руби нет к сожалению... Но с другой стороны это только очень приятный синтаксический сахар не чего более.
3 раз спрашиваю для особо непонятливых. Нам нужно выполнить некий код в каком-нибудь контексте. Наприр в контексте открытия - безобасного закрытия файла. Или в контексте Начало-конец OpenGL блока или в контексте выборки из БД. Создавать здесь отдельную функцию и как то её именовать - верх идиотизма (в принципе никто так и не делает хотя это в том же питоне возможно), так как хочеться только указать КОНТЕКСТ выпонления блокак кода...
> Если я правильно тебя понял, то такая конструкция будет в Python 2.5 Называется "with", IIRC
Уже понял, молодцы вместо общего решения сделали частное:) Хотя может для Питона это и лучше. Хотя мне не понравилось как нужно создавать сами функции, работающие с with.