Де навчитися практично використовувати Common Lisp [закрито]


79

Я програміст на C ++, який намагається вивчити Common Lisp. Я переглянув деякі книги, такі як Земля Ліспа, і прочитав численні статті в Інтернеті про різні достоїнства Ліспа. Однак мені потрібна порада.

Майже все, що я читав про Common Lisp, пов’язане з тим, наскільки він дивовижний і наскільки вражаюче швидко ви можете з ним зробити щось і як він дивовижно вирішив багато проблем із сучасними мовами програмування 30 років тому. Також наскільки дивовижними є макроси, і як кожна кожна парадигма програмування (ОО, функціональна, на основі акторів чи інше тощо) може бути використана в Lisp, і як списки є остаточною структурою даних. В основному ставлячись до Ліспа як до дослідницької мови та кажучи, наскільки він різний та революційний.

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

Тож моє питання полягає в тому, який найкращий ресурс (будь то веб-сайт, книга, що-небудь), який зосереджений на навчанні користуванню Common Lisp для виконання загальних завдань програмування, таких як

  • Як читати файли
  • Як прочитати файл, замінити слова у файлі та записати результат назад у файл
  • Ітераціюйте файли в каталозі та інші матеріали файлової системи
  • Взаємодійте з SQL db
  • Здійснюйте зв’язок через розетки
  • Потоки для таких речей, як веб-сервер
  • Створюйте графічні інтерфейси
  • Виконувати операції з бінарними файлами
  • Напишіть синтаксичний аналізатор (не перекладач для Lisp у Lisp, який, як я розумію, схожий на 5 рядків Lisp)
  • Взаємодійте з операційною системою (тобто матеріалами, написаними на C або C ++), щоб виконувати те, що Lisp не може виконувати спочатку
  • Як писати розширення Lisp на C (чи можливо це?)
  • Вбудуйте інтерпретатор lua (чи можливо це?)

А також на менш практичній нотатці, як реалізувати загальнодоступні структури даних у lisp, такі як куча, стек, бінарне дерево пошуку тощо. Однак це може бути просто за допомогою операцій зі списком Lisp, як carі cdrправильно. Не знаю.

Я дуже сумніваюся, що будь-що з цього (за винятком останніх двох у списку) неможливо з Lisp, інакше люди цього не люблять так сильно. І вищезазначене, що я прочитав, згадує безліч програм реального світу, написаних на Lisp (веб-магазин Yahoo! приходить мені на думку).

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

До речі, я бачив Практичний загальний Lisp Пітера Сейбела, але, судячи з TOC, він торкається лише деяких речей, для яких я хотів би навчитися використовувати Lisp.

Ще одне запитання, якщо я можу (вибачте, якщо це поєднує два питання в одне), де я можу знайти посилання на функції та речі Ліспа?

І мені дуже хочеться сподобатися Ліспе.


3
Приємне запитання. Я сам, будучи програмістом на C ++, вивчав Lisp цього літа, головним чином із книгами, запропонованими у відповідях. Досі дуже щасливий, але все ще пробираюся через макроси. On Lisp від Пола Грем - справжня коштовність. Крім того, матеріали про Emacs Lisp допомагають вам стежити за Lisp загалом, а також дозволяють писати справжні корисні сценарії з самого редактора.
Дієго Севілья

Зараз на сторінці Початок роботи Common Lisp на Docs.SO є велика сторінка ресурсів Common Lisp.
Густав Бертрам,

Зараз також існує сучасна кулінарна книга Common Lisp . Його TOC поки що не такий великий, тому ми шукаємо дивовижні та сучасні бібліотеки у Awesome CL списку. І +1 для "рецептів CL" Е. Вейтца.
Ehvince

Відповіді:


95

Я б запропонував прочитати " Практичний загальний Lisp ", оскільки він уже відповідає на деякі ваші запитання.

Є, мабуть, три-чотири книги, які слід прочитати :

Загальне посилання на Lisp

Посібники

Тепер наступне, що ви повинні перевірити - це посібник з вашої реалізації Lisp. У ньому описано багато конкретних розширень: мережеві мережі, теми, ...

Документація для реалізацій Common Lisp:

SLIME (на базі Emacs Lisp-IDE) має Керівництво користувача SLIME .

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

Бібліотеки

Для використання в бібліотеках

Тепер розглянемо деякі Ваші моменти:

  • Як читати файли

Перегляньте словник файлів і потоків у HyperSpec . З ВІДКРИТИМ ПОТОКОМ, ПРОЧИТАТИ, ПРОЧИТАТИ РЯДКУ, ЧИТАТИ ЗНАЧЕННЯ, ЧИТАТИ БАЙТ, ЧИТАТИ-ПОСЛІДОВНІСТЬ, ...

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

Використовуйте вище. Див. Також: WRITE та пов’язане.

  • Ітераціюйте файли в каталозі та інші матеріали файлової системи

Дивись вище. КАТАЛОГ, назви шляхів, ...

  • Взаємодійте з SQL db

Використовуйте, наприклад, бібліотеку CLSQL.

  • Здійснюйте зв’язок через розетки

Перегляньте керівництво до вашого Lisp або скористайтесь однією з портативних бібліотек. Див. Швидкий список.

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

Перегляньте керівництво до вашого Lisp або скористайтесь однією з портативних бібліотек. Див. Швидкий список.

  • Створюйте графічні інтерфейси

Залежить. Див. Швидкий список або бібліотеку для конкретного впровадження.

  • Виконувати операції з бінарними файлами

Див. Hyperspec щодо файлових та потокових операцій. ЗАПИСАЙТЕ, ЧИТАЙТЕ. Відкрийте потік як двійковий потік.

  • Напишіть синтаксичний аналізатор (не перекладач для Lisp у Lisp, який, як я розумію, схожий на 5 рядків Lisp)

Для цього використовуйте один із існуючих інструментів. Вивчіть існуючі парсери. У Lisp написано багато парсерів, але в книгах про це мало (крім парсерів природних мов, які описані в літературі про ШІ).

  • Взаємодійте з операційною системою (тобто матеріалами, написаними на C або C ++), щоб виконувати те, що Lisp не може виконувати спочатку

Залежить. Див. Швидкий список або бібліотеку для конкретного впровадження.

  • Як писати розширення Lisp на C (чи можливо це?)

Залежить. Див. Швидкий список або бібліотеку для конкретного впровадження. -> FFI

Остаточна порада: Прочитайте код інших авторів.

Вивчіть інший код Ліспа. Існує досить різноманітний код Lisp. Від веб-серверів до програм для композиції музики.


2
Здається, багато речей специфічно для реалізації. Чи є щось подібне до C, яке не є специфічним для реалізації, а стосується операційної системи ? Здається, неможливо змусити всіх, хто хоче ваш код, використовувати обрану вами реалізацію. Також мене не дуже цікавить ШІ.
NewLisper

4
@NewLisper: існує багато бібліотек переносимості. Див. Швидкий список.
Райнер Йосвіг,

4
@NewLisper: навіть якщо вас не цікавить ШІ, вам слід прочитати частину літератури, оскільки там описується підхід "символічного програмування", для якого був винайдений Лісп.
Райнер Йосвіг

2
@NewLisper: Це досить повна відповідь. Lisp ближче до Python у тому, як він відноситься до викликів OS & C / C ++. Кажуть, досить просто створити FFI (зовнішній функціональний інтерфейс). Варто також зазначити, що, здається, перевагу користувачів Common Lisp в Інтернеті, здається, використовують SBCL.
Пол Натан

2
Я б додав кілька конкретних бібліотек: sockets: usocket; веб-сервер: hunchentoot; різьблення: бордо-нитки, шанл; Взаємодія з ОС / зв'язування C-матеріалів: CFFI, UFFI.
Svante

6

Ознайомтеся з вікі Cliki Common Lisp, вона містить список бібліотек, доступних для Common Lisp, які допоможуть вам виконати всі ваші завдання.

Крім того, ви захочете ознайомитись із Common Cook Lisbook (є також більш оновлена ​​версія ). Він має купу коди для загальних завдань , таких як читання одного рядка файлу в той час , і іноземні функціональних інтерфейсів для взаємодії з бібліотеками , написаних на C .

Ви можете писати розширення для Lisp на C залежно від того, яку реалізацію ви використовуєте. Наприклад, Emacs-Lisp дозволяє вам це робити, хоча це не є загальним Lisp. Зазвичай те, що ви хочете зробити, це написати код у Common Lisp, а потім максимально оптимізувати його, використовуючи різні декларації компілятора Lisp, або інший метод, коли ви використовуєте зовнішній інтерфейс функції.

Обробка потоків залежить від того, яку реалізацію ви використовуєте, але я думаю, що більшість із них мають потоки зараз.

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

Хтось склав список параметрів графічного інтерфейсу для Lisp :

  • cl-gtk2, інтерфейс до бібліотеки графічного інтерфейсу GTK
  • Макклім
  • Гранат
  • Загальний Qt
  • EQL

1
Спільна кулінарна книга Lisp виглядає справді корисною. Як я вже сказав іншому хлопцеві, здається, що багато речей специфічні для реалізації. Не здається чесним змусити всіх, кого ви хочете мати можливість запускати свій код, використовувати ту саму реалізацію, яку ви використовуєте. Це просто так?
NewLisper

Так, це так, деякі люди намагаються дотримуватися стандарту ANSI Common Lisp, хоча або намагаються дотримуватися бібліотек, які працюють у декількох реалізаціях, так що це не надто складнощі.

Ви втрачаєте здатність робити багато речей, якщо дотримуєтесь ANSI Common Lisp, як-от файлова система, мережеві речі тощо?
NewLisper

Lisp полегшує написання переносних бібліотек поверх API, специфічних для реалізації, тому я б про це не хвилювався.
Павло Пенев

Гей, не могли б ви змінити URL-адресу кулінарної книги на lispcookbook.github.io/cl-cookbook ? Це той самий вміст, але в основному доповнений, застарілі речі видалено та мають вигляд краще. Подивіться його історію git! Дякую.
Ehvince
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.