февраля 01, 2012

Лисп в первый раз в жизни

Вопрос к лисп-аудитории.

Мне скоро потребуется заменить моего друга на кружке по теории алгоритмов. Рассказывать я могу о чём угодно в течении полутора часов, и я решил рассказать о некоторых философских идеях лиспа для расширения кругозора. Пока что мне приходят в голову две темы для рассказа:

  1. Кодогенерация (макросы, использование программы как данных)
  2. ФП на примере обработки списков (lambda, map, reduce, apply и т.д.)
А какие ещё идеи по вашему мнению стоило бы включить в рассказ?

[update] Если что, то слушатели — десятиклассники, их опыт программирования недалеко выходит за школьный, но есть некоторая стандартная алгоритмическая база.


16 комментариев:

Dmitry комментирует...

Я думаю, нужно сосредоточиться на лёгкости кастомизировать лисп под себя. Это то, что отличает лисп от всех других языков. Отсюда же плавно перейти к макросам и построению 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 зачитать.

Sopin Dmitry комментирует...

ИМХО лучше по ФП рассказать - кодогенерация конечно круто, но врятли поймут. И к тематике ближе.

Анонимный комментирует...

Следует, наверное, рассказать о том, что семантика лиспа вполне задается лисп-машиной, под которой запускается программа. Причем эта лисп-машина сама является полноценной программной сущностью и может быть как угодно изменена во время работы программы.

LinkFly комментирует...

Имхо лучше сделать упор на минималистичный синтаксис и представления программ как данных. А потом уже и про кодогенерацию как базирующуюся на этой основе. Отметить что на уровне метапрограммирования может использоваться функционал из нижележащего уровня (т.е. обычные ф-ии используются и на уровне метапрограммирования - на уровне когда программы пишут программы), отметить что это делает метапрограммирование простым. Ну и примеры на RESTAS дабы показать практичность - это было бы вообще супер.

Анонимный комментирует...

Про замыкания было бы полезно рассказать. Очень мощная вещь.

Sergei комментирует...

Покажите в своем исполнении лекцию sicp где на доске за 30 минут эмулятор цифровых схем пишут попутно свою объектную систему вводя.

Dmitry комментирует...

Раз десятикласники -- то слишком много рассказывать не стоит. Расскажи про списочную структуру, абстрактное синтаксическое дерево и возможность его менять на лету. Это будет именно про лисп. Если сосредоточишься на ФП, то стаким же успехом можешь рассказывать и про Haskell, и про Ruby.

Анонимный комментирует...

Расскажи про пример реализации какой-нибудь задачи как "расстановка скобочек вокруг спецификации" - очень цепляюще может выйти.

Дож комментирует...

Всем спасибо за советы! Рассказал про базовые возможности лиспа, про map, reduce, lambda, count-if, remove-if, и прочие полезные вещи, как реализовывать с помощью этого некоторые действия на списках (такие как сумма элементов, подсчёт числа нечётных чисел, сортировки). Они даже сами пописали программы. На это только времени и хватило, впрочем я этого и ожидал.

Дож комментирует...

А что за «расстановка скобочек вокруг спецификации»? Я про такую задачу не слышал :)

Dmitry комментирует...

Это когда фигачишь eDSL на лиспе с синтаксом, максимально близким к спеке. Чтобы получить работающую прогу -- просто расставляешь скобочки вокруг элементов спеки, и ядро eDSL выполняет остальную работу.

Дож комментирует...

Понятно, спасибо :)

Отправить комментарий

Постоянные читатели

Обо мне

Моя фотография
Мой e-mail: vitek_03(at)mail(dot)ru