Вопрос к лисп-аудитории.
Мне скоро потребуется заменить моего друга на кружке по теории алгоритмов. Рассказывать я могу о чём угодно в течении полутора часов, и я решил рассказать о некоторых философских идеях лиспа для расширения кругозора. Пока что мне приходят в голову две темы для рассказа:
- Кодогенерация (макросы, использование программы как данных)
- ФП на примере обработки списков (lambda, map, reduce, apply и т.д.)
[update] Если что, то слушатели — десятиклассники, их опыт программирования недалеко выходит за школьный, но есть некоторая стандартная алгоритмическая база.
16 комментариев:
Я думаю, нужно сосредоточиться на лёгкости кастомизировать лисп под себя. Это то, что отличает лисп от всех других языков. Отсюда же плавно перейти к макросам и построению eDSL. Про lambda, map/reduce рассказывать не стоит -- этого добра и в других языках полно. Еще важная часть -- процесс разработки с применением Emacs+Slime. Такой среды разработки нет ни в одном ЯП и врядли будет в ближайшем будущем.
Про ФП слушатели ещё не слышали насколько понимаю, поэтому почему бы не рассказать? Тем более, что оно везде есть и используется.
Про кастомизацию я конечно же попытаюсь рассказать.
С Emacs+Slime я сам не очень хорошо знаком, да и всё-таки не хотелось бы привязываться к какому-то определённому диалекту/технологии/среде, я ведь не пересаживаю кого-то программировать на лисп прямо сейчас, а хочу скорее передать способ мышления в построении программ и алгоритмов.
Лисп один. Прикладных диалектов много и они разнятся. Когда-то давно это была целая самодостаточная инфраструктура. Включая аппаратные реализации - лиспмашины. В нынешнее время лиспмашинами иногда называют программы реализующие тот или иной лисп. Процесс программирования заключался и заключается в преобразовании этой лиспмашины для решения необходимой задачи.
Такой подход сохранился, но теперь он урезано эмулируется с помощью emacs/slime.
Слово лисп сейчас обозначает то же, что и раньше - list processing. А вот common lisp/schema/racket/clojure это уже адаптированные к сегодняшним реалиям языки/инфраструктуры.
Если брать common lisp, то там есть, макросы, макроридеры, динамические и лексические переменные, CLOS, MOP, условия и перезапуски и т.д. Лучше всего расписано в common lisp the language.
Чтобы завладеть вниманием зрителя, в частности программиста, можно использовать такой "американский прием". Раскройте им на весь проектор емакс и за 50 строчек сделайте блог на, в частности, cl, restas, parenscript (кодогенератор cl->javascript). А на оставшиеся час сорок рассказывайте почему программистов на яве много, они все каждый день овертаймят, а общего коммунизма, как высшей меры социализма до сих пор не наступило.
А что там про чФП рассказывать? Нет глобальных переменных и присваивания, всё. А ну да, реализована хвостовая рекурсия для циклов. Минут 10 от силы.
> Слово лисп сейчас обозначает то же, что и раньше - list processing.
Я думал, что это слово сейчас обозначает семейство языков с общим синтаксисом :)
Проектора, увы, нет, и даже компов нет, только мой планшет. А главное — времени на подготовку нет.
Понты и шоу, холивары без оппонентов, — не мой стиль :) Хочу что-то полезное рассказать.
ФП может быть нетривиальным подходом, если человек привык только к процедурному стилю написания программ.
Да забыл, можно просто главы и sicp зачитать.
ИМХО лучше по ФП рассказать - кодогенерация конечно круто, но врятли поймут. И к тематике ближе.
Следует, наверное, рассказать о том, что семантика лиспа вполне задается лисп-машиной, под которой запускается программа. Причем эта лисп-машина сама является полноценной программной сущностью и может быть как угодно изменена во время работы программы.
Имхо лучше сделать упор на минималистичный синтаксис и представления программ как данных. А потом уже и про кодогенерацию как базирующуюся на этой основе. Отметить что на уровне метапрограммирования может использоваться функционал из нижележащего уровня (т.е. обычные ф-ии используются и на уровне метапрограммирования - на уровне когда программы пишут программы), отметить что это делает метапрограммирование простым. Ну и примеры на RESTAS дабы показать практичность - это было бы вообще супер.
Про замыкания было бы полезно рассказать. Очень мощная вещь.
Покажите в своем исполнении лекцию sicp где на доске за 30 минут эмулятор цифровых схем пишут попутно свою объектную систему вводя.
Раз десятикласники -- то слишком много рассказывать не стоит. Расскажи про списочную структуру, абстрактное синтаксическое дерево и возможность его менять на лету. Это будет именно про лисп. Если сосредоточишься на ФП, то стаким же успехом можешь рассказывать и про Haskell, и про Ruby.
Расскажи про пример реализации какой-нибудь задачи как "расстановка скобочек вокруг спецификации" - очень цепляюще может выйти.
Всем спасибо за советы! Рассказал про базовые возможности лиспа, про map, reduce, lambda, count-if, remove-if, и прочие полезные вещи, как реализовывать с помощью этого некоторые действия на списках (такие как сумма элементов, подсчёт числа нечётных чисел, сортировки). Они даже сами пописали программы. На это только времени и хватило, впрочем я этого и ожидал.
А что за «расстановка скобочек вокруг спецификации»? Я про такую задачу не слышал :)
Это когда фигачишь eDSL на лиспе с синтаксом, максимально близким к спеке. Чтобы получить работающую прогу -- просто расставляешь скобочки вокруг элементов спеки, и ядро eDSL выполняет остальную работу.
Понятно, спасибо :)
Отправить комментарий