Что за дурацкая привычка псевдолисперов выкладывать чанки кода в одну строку? Лисп — ни разу не язык однострочников, это самый вертикальный язык из всех мне известных, и в этом его большое преимущество.
Вышло все равно не мгновенно очевидно, но это изза сложности понимая самого комбинатора.
Не создавайте, пожалуйста, языку дурную славу, ее у него и так достаточно.
Судя по тому сколько яблофонеров независимо друг от друга отписались в стиле «вот вам ваша непремодерируемая платформа», я могу сделать вывод, что это их реально волнует. Будто они полтора года, сцепив зубы, ждали чего-то подобного, только чтобы оправдать премодерацию на своих айфонах.
Написать приложение, выполняющее подобные malicious действия, можно под любую платформу. И спрятать это так, чтобы премодерацию пройти. Помните 15-летнего парня, который сделал tethering для айфона, замаскировав программу под фонарик? А ведь по «определить по API вызовам» (как писал кто-то выше) доступ к Wi-Fi проще, чем разглядеть среди скачивания рекламных баннеров запросы, направленные на ДДОС другого сайта.
Пока вирусы не могут САМИ проникнуть в ваш телефон, ни о каких ВИРУСАХ речи идти не может. Сам скачал — сам установил — сам дал права. Пока пользовали отделались легким испугом и частью трафика — вполне адекватное наказание за необдуманные действия. И не надо прятать голову в песок и заявлять, что «обычным пользователям не нужны такие сложности, не нужно знать кому и какие права давать». Обычный пользователь выучил какие кнопки нажимать на телефоне чтобы он работал? Значит не проблема и выучить это. Мир в котором мы живем всё больше наполняется разнообразными устройствами, и чтобы не быть неандертальцем пользователь обязан выучить элементарные правилы жизни в таком мире.
И ко всему этому, Андроид никогда не был платформой для хомяков. Для них есть гораздо более привлекательная платформа.
Второе логически вытекает из первого, а вот вторым без первого заниматься как-то бессмысленно. Пускай это отчасти жонглирование словами. Но если бы процесс написания книги именовался бы среди авторов «писанием букв (слов, предложений)», а исполнение произведений среди музыкантов — «игрой нот» или «давлением клавиш», это явно бы имело оттенок небрежности и халтуры. Написаный код — это побочный эффект деятельности программиста, и меня удивляет почему скалькированое с английского «писать код» стало популярнее слова «программировать». Не находите странным?
Серебрянные пули, как известно, все переплавили в бижутерию одновременно с танками. Но источники знаний остались те же: «Структура и интерпретация компьютерных программ» Абельсона и Сассмана, «Алгоритмы и структуры данных» Вирта. Можно Кнута для общего развития.
От слова «код» рябит в глазах. Если бы вы научили ваших подопечных программировать, а не «писать [хороший] код», то работа получилась бы более эффективной.
Бросаться «фабриками» и «декораторами» — это вообще слёзы. Подумать только, в 21 веке кто-то считает книжку Банды Четырех серебряной пулей программирования.
В BigInteger, естественно.
Если нам нужен факториал от 1 до 20, то можно просто наперед просчитать все двадцать значений и сохранить в массив. Зачем еще придумывать какие-то кеширования?
Понятное дело, что факториал 20000 мне не нужен. Как и просто факториал мне не нужен в 90% приложений. Мы говорим о концептуальный возможности на простом знакомом примере, не более того.
Вы правы, но всё таки то, что JVM не поддерживает TCO, сказывается в конечном итоге.
Кому интересно, мне удалось обойти этот недостаток JVM с помощью ленивой бесконечной последовательности:
(def factorial (map second (iterate (fn[[n r]] [(inc n) (* n r)]) [1 1])))
(take factorial 20000)
Проблема в том, что при вызове факториала n оно закеширует все значения факториалов 1..n, что для n = 20000 занимает около 400 Мб памяти. Понятия не имею где может понадобится такая «оптимизация»:)
Во-первых, в приведенном TheShock примере TCO невозможна. Видимо, вы недостаточно внимательно изучили что такое Tail Call Optimization (а это оптимизация ХВОСТОВОГО рекурсивного вызова, то есть он (вызов) должен быть последней операцией в функции.
Во-вторых, вот вам явный пример, почему TCO в Джаве таки пригодилось бы. Без нее невозможно написать функцию с кешированием в нерекурсивном виде. Только, возможно, через explicit проверку в кеше внутренних значений, а не аргументов.
Для Windows можно скачать заточеную версию SciTE с дебагером и прочими вкусностями.
Я пишу на Lua в основном для Awesome, поэтому использую Emacs — обычный дебагер мне не нужен, там немного другой подход.
Извините, я за пять комментариев уже потерял надежду обратить ваше внимание на искомые темы разговора. Но я рад, что вы, несмотря на мой невежливый поступок, все же решили расширить свой кругозор.
Не серчайте, может ознакомившись с основами подхода, вы поймете почему я в конце концов не выдержал:).
>> Однако не всем обязательно ломать ногу чтобы знать что такое перелом ноги.
Вот он — аргумент всех недалеких личностей, гордящихся своей неосведомленностью и делающих на ее основе те или иные выводы.
По вашей аналогии, вы не просто не ломали ногу, вы никогда не открывали ни одной книжки по анатомии.
Я поражаюсь не вашим уровнем некомпетентности, нет — в конце концов, никто не знает всего. Меня поражает уверенность, с который вы говорите о вещах, о которых не имеете ни малейшего представления.
>> А нужны целые исследования чтобы понять что императивное программирование для человеков интуитивнее чем функциональное?
А нужны целые исследования чтобы понять что функциональное программирование для человеков интуитивнее чем императивное? Чем ваше заявление аргументированее моего? Я бы сказал наоборот. Я использую оба подхода, вы — только один.
>> Да и процессоры… императивное программирование ближе…
При чем тут это? Мы говорили об удобстве для человека, а не для процессора.
>> при том же дебаге
При отладке функционального кода не нужен дебагер.
>> русская википедия… заявляет…
Простите, но это столь же далеко от нашей темы, сколь ваша обознаность в ней. Дружески предлагаю (вы конечно сейчас можете сказать, чтобы я не указывал вам что делать, ваше право) освоить для общего развития один язык, поддерживающий функциональную парадигму (ту же Скалу, например — минимальные отличия от Java), и после этого продолжить нашу дискуссию, когда вы станете более подкованы во всех этих вопросах.
>> Функциональное же программирование не упростит жизнь программистам, а иногда возможно и наоборот — весьма усложнит.
Это вы на основе каких-то исследований утверждаете? Может ссылки приведете?
>> В LISP был гарбадж коллекшн и что? И ничего.
И не поспоришь.
А что вы подразумеваете под мейнстримными языками? Языки вроде Delphi, с которых каждые 5 лет нужно переучиваться на что-то другое потому что остаешься «не в струе»?
Я тоже очень часто работаю с git в консоли, хотя когда подключил к Emacs-у magit — начал потихоньку забивать. Основная причина — из magit значительно удобнее стейжить отдельные файлы.
Автору:
К git в больших проектах следует относится скорее не как к системе контроля версий, а как к конструктору любой системы контроля версий. В зависимости от предпочтений и стиля разработки, к нему можно один раз написать набор скриптов, покрывающих весь development routine, и больше не вбивать одни и те же комманды по несколько раз.
Но вы работаете с Java, а следовательно используете garbage collection, который тоже 30 лет назад считался в широких кругах «бесполезной и глупой затеей».
Вы правы в том смысле, что Java как язык нет смысла перегружать кучей сахара.
С другой стороны, добавление в JVM тех же замыканий пойдет на пользу многим языкам для JVM. Например, Clojure теряет значительную долю производительности из-за повсеместной генерации анонимных классов там, где используются лямбды.
«Мы ориентировались не на Lisp-программистов, нет; нашей целью были С++-программисты. Нам удалось протащить их на полпути ближе к Лиспу». (Guy Steele о разработке языка Java)
Посмотрите на последние тенденции в разработке новых языков. Посмотрите на Python, Ruby, новые версии C#, посмотрите на концепции вроде сборки мусора, замыканий, разработку eDSL-ей. Однажды вы проснетесь утром и поймете, что язык, на котором вы пишете — это Common Lisp с немного измененным синтаксисом.
Может разовьете идею в что-то большее? В Y Combinator'е Пола Грэма есть RFS на разработку на мобильных устройствах. Вот ссылка: ycombinator.com/rfs5.html
(defn Y [r]
(letfn [(rec[f] (f f))]
(rec (fn[g]
(r (fn[x] ((rec g) x)))))))
Вышло все равно не мгновенно очевидно, но это изза сложности понимая самого комбинатора.
Не создавайте, пожалуйста, языку дурную славу, ее у него и так достаточно.
Написать приложение, выполняющее подобные malicious действия, можно под любую платформу. И спрятать это так, чтобы премодерацию пройти. Помните 15-летнего парня, который сделал tethering для айфона, замаскировав программу под фонарик? А ведь по «определить по API вызовам» (как писал кто-то выше) доступ к Wi-Fi проще, чем разглядеть среди скачивания рекламных баннеров запросы, направленные на ДДОС другого сайта.
Пока вирусы не могут САМИ проникнуть в ваш телефон, ни о каких ВИРУСАХ речи идти не может. Сам скачал — сам установил — сам дал права. Пока пользовали отделались легким испугом и частью трафика — вполне адекватное наказание за необдуманные действия. И не надо прятать голову в песок и заявлять, что «обычным пользователям не нужны такие сложности, не нужно знать кому и какие права давать». Обычный пользователь выучил какие кнопки нажимать на телефоне чтобы он работал? Значит не проблема и выучить это. Мир в котором мы живем всё больше наполняется разнообразными устройствами, и чтобы не быть неандертальцем пользователь обязан выучить элементарные правилы жизни в таком мире.
И ко всему этому, Андроид никогда не был платформой для хомяков. Для них есть гораздо более привлекательная платформа.
Серебрянные пули, как известно, все переплавили в бижутерию одновременно с танками. Но источники знаний остались те же: «Структура и интерпретация компьютерных программ» Абельсона и Сассмана, «Алгоритмы и структуры данных» Вирта. Можно Кнута для общего развития.
Бросаться «фабриками» и «декораторами» — это вообще слёзы. Подумать только, в 21 веке кто-то считает книжку Банды Четырех серебряной пулей программирования.
Если нам нужен факториал от 1 до 20, то можно просто наперед просчитать все двадцать значений и сохранить в массив. Зачем еще придумывать какие-то кеширования?
Понятное дело, что факториал 20000 мне не нужен. Как и просто факториал мне не нужен в 90% приложений. Мы говорим о концептуальный возможности на простом знакомом примере, не более того.
Кому интересно, мне удалось обойти этот недостаток JVM с помощью ленивой бесконечной последовательности:
(def factorial (map second (iterate (fn[[n r]] [(inc n) (* n r)]) [1 1])))
(take factorial 20000)
Проблема в том, что при вызове факториала n оно закеширует все значения факториалов 1..n, что для n = 20000 занимает около 400 Мб памяти. Понятия не имею где может понадобится такая «оптимизация»:)
Во-вторых, вот вам явный пример, почему TCO в Джаве таки пригодилось бы. Без нее невозможно написать функцию с кешированием в нерекурсивном виде. Только, возможно, через explicit проверку в кеше внутренних значений, а не аргументов.
Я пишу на Lua в основном для Awesome, поэтому использую Emacs — обычный дебагер мне не нужен, там немного другой подход.
Не серчайте, может ознакомившись с основами подхода, вы поймете почему я в конце концов не выдержал:).
Вот он — аргумент всех недалеких личностей, гордящихся своей неосведомленностью и делающих на ее основе те или иные выводы.
По вашей аналогии, вы не просто не ломали ногу, вы никогда не открывали ни одной книжки по анатомии.
Я поражаюсь не вашим уровнем некомпетентности, нет — в конце концов, никто не знает всего. Меня поражает уверенность, с который вы говорите о вещах, о которых не имеете ни малейшего представления.
А нужны целые исследования чтобы понять что функциональное программирование для человеков интуитивнее чем императивное? Чем ваше заявление аргументированее моего? Я бы сказал наоборот. Я использую оба подхода, вы — только один.
>> Да и процессоры… императивное программирование ближе…
При чем тут это? Мы говорили об удобстве для человека, а не для процессора.
>> при том же дебаге
При отладке функционального кода не нужен дебагер.
>> русская википедия… заявляет…
Простите, но это столь же далеко от нашей темы, сколь ваша обознаность в ней. Дружески предлагаю (вы конечно сейчас можете сказать, чтобы я не указывал вам что делать, ваше право) освоить для общего развития один язык, поддерживающий функциональную парадигму (ту же Скалу, например — минимальные отличия от Java), и после этого продолжить нашу дискуссию, когда вы станете более подкованы во всех этих вопросах.
Это вы на основе каких-то исследований утверждаете? Может ссылки приведете?
>> В LISP был гарбадж коллекшн и что? И ничего.
И не поспоришь.
(defn reverse [coll]
(reduce conj () coll)
* в данном случае пустой список как аргумент для reduce — это начальное значение
Автору:
К git в больших проектах следует относится скорее не как к системе контроля версий, а как к конструктору любой системы контроля версий. В зависимости от предпочтений и стиля разработки, к нему можно один раз написать набор скриптов, покрывающих весь development routine, и больше не вбивать одни и те же комманды по несколько раз.
С другой стороны, добавление в JVM тех же замыканий пойдет на пользу многим языкам для JVM. Например, Clojure теряет значительную долю производительности из-за повсеместной генерации анонимных классов там, где используются лямбды.
Посмотрите на последние тенденции в разработке новых языков. Посмотрите на Python, Ruby, новые версии C#, посмотрите на концепции вроде сборки мусора, замыканий, разработку eDSL-ей. Однажды вы проснетесь утром и поймете, что язык, на котором вы пишете — это Common Lisp с немного измененным синтаксисом.