Где узнать, как использовать Common Lisp на практике [закрыто]

79

Я программист на C ++, пытаюсь изучить Common Lisp. Я просмотрел некоторые книги, такие как Land of Lisp, и прочитал множество онлайн-статей о различных достоинствах Lisp. Однако мне нужен совет.

Почти все, что я читал о Common Lisp, связано с тем, насколько он удивителен и насколько быстро вы можете с ним справляться, и о том, как 30 лет назад он превосходно решал многие проблемы с современными языками программирования. Также, насколько удивительны макросы и как каждая парадигма программирования (объектно-ориентированная, функциональная, основанная на акторах и т.д.) может быть использована в Lisp, и как списки являются окончательной структурой данных. По сути, рассматривать Lisp как язык исследований и говорить, насколько он отличается и революционен.

И все это, вероятно, правда, но проблема в том, что я не видел много того, как делать практические вещи, например, читать файл, разбивать его на слова и обрабатывать его. Мне интересно изучать Common Lisp не ради изучения Common Lisp, а ради того, чтобы то, что я делал на C ++, было сделано быстрее и с меньшим количеством ошибок.

Итак, мой вопрос в том, какой ресурс является лучшим (будь то веб-сайт, книга, что угодно), который фокусируется на обучении использованию Common Lisp для выполнения общих задач программирования, таких как

  • Как читать файлы
  • Как прочитать файл, заменить слова в файле и записать результат обратно в файл
  • Итерировать файлы в каталоге и другие файлы файловой системы
  • Взаимодействовать с базой данных SQL
  • Связь через розетки
  • Потоки для таких вещей, как веб-сервер
  • Создать графический интерфейс
  • Выполнять операции с бинарными файлами
  • Напишите парсер (не интерпретатор Лиспа в Лиспе, который, как я понимаю, похож на 5 строк Лиспа)
  • Взаимодействовать с операционной системой (т.е. с вещами, написанными на C или C ++), чтобы делать то, что Lisp не может делать изначально.
  • Как писать расширения Lisp на C (возможно ли это?)
  • Встроить интерпретатор lua (возможно ли это?)

А также на менее непосредственно практической точки зрения , как реализовать общие структуры данных в лепет , таких как куча, стек, бинарное дерево поиска и т.д. Однако это может быть только с помощью списка операций LISP как carи cdrв правильном направлении. Я не знаю.

Я очень сомневаюсь, что что-либо из этого (за маловероятным исключением двух последних в списке) невозможно с Lisp, иначе людям это не понравилось бы. И в вышеупомянутом материале, который я прочитал, упоминается множество реальных программ, написанных на Lisp (на ум приходит интернет-магазин Yahoo!).

Однако, имея раньше программирование на ( ? ) Императивном языке, мне не терпится использовать полученные знания для написания реальных приложений. Итак, каков самый быстрый способ научиться писать практическое программное обеспечение с помощью Lisp?

Между прочим, я видел практический Common Lisp Питера Сейбеля, но, судя по оглавлению, он затрагивает только некоторые вещи, для которых я хотел бы научиться использовать Lisp.

Еще один вопрос, если можно (извините, если это объединяет два вопроса в один), где я могу найти ссылку на функции Lisp и прочее?

И мне очень хочется любить Лисп.

NewLisper
источник
3
Хороший вопрос. Я сам, будучи программистом на C ++, этим летом изучал Лисп, в основном по книгам, предложенным в ответах. До сих пор очень доволен, но все еще разбираюсь в макросах. On Lisp Пола Грэма - настоящая жемчужина. Кроме того, материал по Emacs Lisp помогает вам не отставать от Lisp в целом, а также позволяет писать действительно полезные сценарии из самого редактора.
Диего Севилья
Теперь есть обширная страница ресурсов Common Lisp на странице Приступая к работе Common Lisp в Docs.SO.
Густав Бертрам
Также существует обновленная поваренная книга Common Lisp . Однако его оглавление еще не такое обширное, поэтому мы ищем потрясающие и современные библиотеки в списке Awesome CL . И +1 за "Рецепты CL" Э. Вайца.
Ehvince

Ответы:

95

Я предлагаю прочитать « Практический Common Lisp », поскольку он уже отвечает на некоторые из ваших вопросов.

Вероятно, вам стоит прочитать три-четыре книги :

Справочник по Common Lisp

Руководства

Следующее, что вы должны проверить, - это руководство по вашей реализации Lisp. Он описывает множество конкретных расширений: сети, потоки, ...

Документация по реализациям Common Lisp:

SLIME (Lisp-IDE на основе Emacs) имеет руководство пользователя SLIME .

Документация для библиотек Common Lisp:

Библиотеки

Для библиотек используйте

Теперь посмотрим на некоторые из ваших точек зрения:

  • Как читать файлы

См. Словарь файлов и потоков в HyperSpec . WITH-OPEN-STREAM, READ, READ-LINE, READ-CHAR, READ-BYTE, READ-SEQUENCE, ...

  • Как прочитать файл, заменить слова в файле и записать результат обратно в файл

Используйте выше. См. Также: НАПИСАТЬ и т.п.

  • Итерировать файлы в каталоге и другие файлы файловой системы

См. Выше. СПРАВОЧНИК, пути, ...

  • Взаимодействовать с базой данных SQL

Используйте, например, библиотеку CLSQL.

  • Связь через розетки

См. Руководство к вашему Лиспу или воспользуйтесь одной из переносимых библиотек. См. Quicklisp.

  • Потоки для таких вещей, как веб-сервер

См. Руководство к вашему Лиспу или воспользуйтесь одной из переносимых библиотек. См. Quicklisp.

  • Создать графический интерфейс

Смотря как. См. Quicklisp или библиотеку для конкретной реализации.

  • Выполнять операции с бинарными файлами

См. Hyperspec для файловых и потоковых операций. ЗАПИСЬ БАЙТА, ​​ЧТЕНИЕ БАЙТА. Откройте поток как двоичный поток.

  • Напишите парсер (не интерпретатор Лиспа в Лиспе, который, как я понимаю, похож на 5 строк Лиспа)

Используйте для этого один из существующих инструментов. Изучите существующие парсеры. На Лиспе написано много парсеров, но мало в книгах об этом (кроме парсеров естественного языка, которые описаны в литературе по ИИ).

  • Взаимодействовать с операционной системой (т.е. с вещами, написанными на C или C ++), чтобы делать то, что Lisp не может делать изначально.

Смотря как. См. Quicklisp или библиотеку для конкретной реализации.

  • Как писать расширения Lisp на C (возможно ли это?)

Смотря как. См. Quicklisp или библиотеку для конкретной реализации. -> FFI

Последний совет: прочтите код других авторов.

Изучите другой код Lisp. Существует достаточно очень разнообразного кода на Лиспе. От веб-серверов до программного обеспечения для создания музыки.

Райнер Йосвиг
источник
2
Похоже, что многое зависит от реализации. Есть ли что-нибудь вроде C, которое не зависит от реализации, а зависит от операционной системы ? Похоже, что невозможно заставить всех, кто хочет, чтобы ваш код использовал выбранную вами реализацию. Также меня не очень интересует ИИ.
NewLisper
4
@NewLisper: библиотек переносимости очень много. См. Quicklisp.
Rainer Joswig
4
@NewLisper: даже если вы не интересуетесь ИИ, вам следует прочитать некоторую литературу, потому что она описывает подход «символического программирования», для которого был изобретен Лисп.
Райнер Йосвиг
2
@NewLisper: Это довольно полный ответ. Lisp ближе к Python в том, как он связан с вызовами OS и C / C ++. Говорят, что довольно просто собрать FFI (интерфейс внешней функции). Также стоит отметить, что кажется, что большинство пользователей Common Lisp в сети используют SBCL.
Пол Натан,
2
Я бы добавил несколько конкретных библиотек: sockets: usocket; веб-сервер: hunchentoot; нитки: бордо, шанль; OS-взаимодействие / линковка C-вещи: CFFI, UFFI.
Svante
6

Ознакомьтесь с Cliki, вики Common Lisp, он предоставляет список библиотек, доступных для Common Lisp, которые помогут вам выполнить все ваши задачи.

Кроме того, вы захотите проверить Common Lisp Cookbook (есть также более обновленная версия ). Он имеет кучу коды для общих задач , таких как чтение одной строки файла в то время , и иностранные функциональных интерфейсов для взаимодействия с библиотеками , написанных на C .

Вы можете писать расширения для Lisp на C в зависимости от того, какую реализацию вы используете. Emacs-Lisp, например, позволяет вам это делать, хотя это не Common Lisp. Обычно вы хотите написать код на Common Lisp, а затем оптимизировать его, насколько это возможно, используя различные объявления компилятора Lisp или другой метод, в котором вы используете интерфейс внешней функции.

Многопоточность зависит от того, какую реализацию вы используете, но я думаю, что у большинства из них сейчас есть потоки.

Hunchentoot - один из лучших веб-серверов Lisp, с которым довольно легко начать работу. Вам не нужно самостоятельно писать какой-либо потоковый код, вам просто нужно написать функции обработчика HTTP-запросов.

Кто-то составил список опций графического интерфейса для Лиспа :

  • cl-gtk2, интерфейс к GUI-библиотеке GTK
  • МакКлим
  • Гранат
  • Общий Qt
  • EQL

источник
1
Поваренная книга Common Lisp выглядит действительно полезной. Как я сказал другому парню, похоже, что многие вещи зависят от конкретной реализации. Кажется нечестным заставлять всех, кому вы хотите иметь возможность запускать свой код, использовать ту же реализацию, что и вы. Это просто так?
NewLisper
Да, так оно и есть, некоторые люди пытаются придерживаться стандарта ANSI Common Lisp, хотя или пытаются придерживаться библиотек, которые работают в нескольких реализациях, так что это не слишком хлопотно.
Если вы придерживаетесь ANSI Common Lisp, теряете ли вы способность делать многие вещи, например, файловую систему, сетевые компоненты и т. Д.?
NewLisper
Lisp упрощает написание переносимых библиотек поверх API, специфичных для реализации, так что я бы не стал об этом беспокоиться.
Павел Пенев
Эй, не могли бы вы изменить URL-адрес Поваренной книги на lispcookbook.github.io/cl-cookbook ? Это тот же контент, но в значительной степени дополненный, устаревшие элементы удалены и в более привлекательной форме. Посмотрите его историю git! Благодарю.
Ehvince