Що слід дізнатися зі схеми?


10

Мені було цікаво, які унікальні особливості я можу дізнатися зі схеми, які допоможуть мені стати кращим програмістом?

У мене є великий досвід роботи з основними мовами, і я хочу розширити свій кругозір та дізнатися про функціональні аспекти, яких не вистачає в інших мовах. Мені знайомі закриття з javascript, лямбда-вирази з C #, і мені було цікаво, на чому я можу зосередитись на тому, чого бракує інших мов? Окрім синтаксису Lisp, я відчуваю, що те, що я бачив до цього часу, я вже стикався з іншими мовами.

Що є унікальним для Scheme / Lisp, що навчить мене чомусь новому?


3
Лісп варто вчитися глибокому досвіду просвітництва, який ви матимете, коли нарешті його отримаєте; цей досвід зробить вас кращим програмістом до кінця ваших днів, навіть якщо ви ніколи насправді не використовуєте Lisp дуже багато. - Ерік Реймонд
Роберт Харві


1
@Robert Harvery: Також: xkcd.com/224
Пойндекстер

2
У нинішній формі це питання не є особливо конструктивним. Якщо ви можете переробити її, щоб запитати більш конкретну інформацію, вона може бути корисною.
ChrisF

Див. Також Викладання мов програмування в постліннейський вік та підручник, на який посилається цей документ: Мови програмування: застосування та інтерпретація , де використовується мова ракетки , діалект схеми.
Роберт Харві

Відповіді:


7

Мабуть, найважливіша визначальна характеристика Lisp - це "Код як дані".  Ви не отримаєте цього досвіду абсолютно однаково з будь-якою іншою мовою. У C # найближчим аналогом є дерева експресії.

Саме ця якість робить Lisp чудовою мовою для розбору. Це також якість, яке мотивувало Пола Грема сказати про Ліспа: "Незвичайне в Ліспі - насправді, визначальна якість Лісп - це те, що він може бути написаний сам собою". Хоча компілятори для самостійного розміщення не є новим, жодна мова не робить це так елегантно, як це робить Lisp.

Метапрограмування (те, в чому Лісп також перевершує) - теж гідна річ.

Побиття середніх показників Пол Грехем
http://www.paulgraham.com/avg.html


1
Я думаю, що я ніколи не мав того "ага!" моментом, який ESR мені пообіцяв, було те, що у мене вже було відкриття "коду як даних" у Prolog.
Френк Ширар

1
Чи має Haskell атрибут "код як дані"? Або краса сильно залежить від динамічного набору тексту та рефлексії?
Джої Адамс

1
@Joey: Я думаю, що факт існування шаблону Haskell означає, що Haskell не має атрибута "код як дані".
j_random_hacker

4

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

Завжди корисно спробувати інші парадигми програмування; Ви повертаєтесь оновленими до світу OO з новими ідеями.

Не синтаксис, а міркування, це чудова вправа на мозок. Крім рекурсії та цікавого використання списків, ІМХО ще не багато, але воно того варте того.


Не характерний для схеми. Будь-яка (ну майже будь-яка) функціональна мова чудово підходить для здійснення рекурсії.

Я погоджуюся, але ОП, схоже, зацікавлена ​​у Схемі порівняно з "основними" мовами ....
Ксав'є Нодет

1

Продовження :

У інформатиці та програмуванні продовження - це абстрактне зображення стану управління комп'ютерною програмою. Продовження повторює стан управління програмою, тобто продовження являє собою структуру даних, яка представляє обчислювальний процес у заданій точці виконання процесу; до створеної структури даних можна отримати доступ мовою програмування, а не ховатися в середовищі виконання. Він містить таку інформацію, як поточний стек процесу (включаючи всі дані, час життя яких знаходиться в межах процесу, наприклад, "локальні змінні"), а також точка процесу в обчисленні. Екземпляр продовження може пізніше використовуватись як структура управління; після виклику він відновить виконання з контрольної точки, яку він представляє. "Поточне продовження"

а потім спробуйте реалізувати неоднозначний оператор Маккарті :

У 1963 р. Джон Маккарті, винахідник Ліспа, опублікував працю «Основа математичної теорії обчислень», в якій запропонував функцію (у сенсі цього комп’ютерного програмного слова) амб (.,.). Ідея полягає в тому, що amb (x, y) спочатку дорівнює x. Але якщо пізніше в обчисленні виявиться, що це призводить до певної суперечності, значення x відбирається і замінюється y. Це набагато складніший бізнес, ніж може здатися спочатку. Відкликання значення по суті означає повернення всього стану обчислення до того місця, де воно було, коли amb повернуло значення x, а потім ковзання у значення y. Це означає якось заморожувати та копіювати весь стан, коли x вперше було повернуто. При виявленні суперечності весь стан програми відміняється і замінюється замороженою версією, яка знову активується. Ці заморожені стани відомі як продовження. Багато в чому це як заява GOTO щодо кислоти. Це може спричинити перехід до довільного місця вашого коду. Але продовження краще, ніж GOTO, тому що вони більше піддаються логічним міркуванням.


1

Я можу придумати таке:

  • Справжні макроси (використовуючи всю потужність мови для створення коду)
  • Гомоїконічність (дані як код, код як дані)
  • Ледача оцінка
  • Продовження

Я також думаю, що мови Lisp повинні бути дивовижними для визначення конкретних доменних мов (DSL). Це те, що ви, можливо, захочете прочитати, якщо про нього вже не знаєте.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.