Чему я должен научиться у Схемы?

10

Мне было интересно, какие уникальные возможности я могу извлечь из Scheme, чтобы помочь мне стать лучшим программистом?

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

Что уникального в Scheme / Lisp, что научит меня чему-то новому?

bunglestink
источник
3
Лисп стоит учиться для глубокого просветления, которое вы получите, когда наконец его получите; этот опыт сделает вас лучшим программистом до конца ваших дней, даже если вы никогда не будете использовать сам Lisp. - Эрик Рэймонд
Роберт Харви
1
Также: xkcd.com/297
Роберт Харви
1
@Robert Harvery: Также: xkcd.com/224
Пойндекстер
2
В нынешнем виде этот вопрос не особенно конструктивен. Если вы можете переработать его, чтобы запросить более конкретную информацию, это может быть полезно.
ChrisF
См. Также раздел «Обучение языкам программирования в постлиннейский век» и учебник, на который ссылается этот документ: Языки программирования: применение и интерпретация , в котором используется язык ракеток , диалект схемы.
Роберт Харви

Ответы:

7

Возможно, наиболее важной определяющей характеристикой Lisp является «Код как данные».  Вы не получите такой же опыт, как с любым другим языком. В C # ближайший аналог - деревья выражений.

Именно это качество делает Лисп отличным языком для анализа. Именно это качество побудило Пола Грэма сказать о Лиспе: «Необычная вещь в Лиспе - фактически, определяющее качество Лиспа - это то, что он может быть написан сам по себе». Хотя самонастраивающиеся компиляторы не являются чем-то новым, ни один язык не делает это так элегантно, как Лисп.

Метапрограммирование (то, в чем также превосходит Lisp) также стоит изучить.

Превышение средних значений Полом Грэмом
http://www.paulgraham.com/avg.html

Роберт Харви
источник
1
Я думаю, почему у меня никогда не было этого "ага!" момент, когда ESR пообещал мне, состоял в том, что у меня уже было откровение «код как данные» в Прологе.
Фрэнк Шиарар
1
Имеет ли Haskell атрибут «код как данные»? Или красота сильно зависит от динамического набора текста и отражения?
Джои Адамс
1
@Joey: Я думаю, что тот факт, что Template Haskell существует, означает, что в Haskell отсутствует атрибут «код как данные».
j_random_hacker
4

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

Всегда полезно попробовать другие парадигмы программирования; Затем вы возвращаетесь обновленными в мир ОО с новыми идеями.

Не синтаксис, а рассуждение, это отличное упражнение для мозга. Appart от рекурсии и интересного использования списков, есть не так много IMHO, но это того стоит.

dukeofgaming
источник
Не уникально для схемы. Любой (ну, почти любой) функциональный язык хорош для осуществления рекурсии.
Я согласен, но ФП, похоже, заинтересован в Схеме по сравнению с «основными» языками…
Ксавье Нодет
1

Продолжение :

В информатике и программировании продолжение является абстрактным представлением состояния управления компьютерной программой. Продолжение уточняет состояние управления программой, то есть продолжение - это структура данных, которая представляет вычислительный процесс в заданной точке его выполнения; Созданная структура данных может быть доступна языку программирования, а не скрыта в среде выполнения. Он содержит такую ​​информацию, как текущий стек процесса (включая все данные, время жизни которых находится внутри процесса, например, «локальные переменные»), а также точку процесса в вычислении. Экземпляр продолжения может быть позже использован в качестве управляющей структуры; после вызова он возобновит выполнение с контрольной точки, которую представляет. «Текущее продолжение»

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

В 1963 году Джон Маккарти, изобретатель Lisp, опубликовал статью «Основа математической теории вычислений», в которой он предложил функцию (в смысле слова компьютерной программы) amb (.,.). Идея состоит в том, что amb (x, y) сначала равен x. Но если позже в вычислении будет обнаружено, что это приводит к некоторому противоречию, значение x убирается и заменяется на y. Это гораздо более сложный бизнес, чем может показаться на первый взгляд. Отказ от значения, по сути, означает возврат всего состояния вычисления туда, где оно было, когда amb вернул значение x, а затем проскальзывание в значении y. Это означает как-то замораживание и копирование всего состояния при первом возврате x. При обнаружении противоречия все состояние программы отбрасывается и заменяется замороженной версией, которая активируется повторно. Эти замороженные состояния известны как продолжения. Во многих отношениях это похоже на заявление GOTO по кислоте. Это может вызвать переход к произвольному месту в вашем коде. Но продолжения лучше, чем GOTO, потому что они более поддаются логическим рассуждениям.

knivil
источник
1

Я могу думать о следующем:

  • Реальные макросы (используя всю мощь языка для генерации кода)
  • Гомоиконичность (данные как код, код как данные)
  • Ленивая оценка
  • Продолжения

Я также считаю, что языки lisp должны быть полезны для определения языков, специфичных для предметной области (DSL). Об этом вы, возможно, захотите прочитать, если еще не знаете об этом.

Joanis
источник