Как заставить мой мозг двигаться в «режиме шуток»? - PullRequest
24 голосов
/ 03 марта 2009

Мой профессор сказал нам, что мы можем выбрать язык программирования для нашего следующего задания. Я хотел попробовать функциональный язык, поэтому я решил попробовать clojure. Проблема в том, что я понимаю синтаксис и понимаю основные понятия, но у меня возникают проблемы с тем, чтобы все «щелкнуло» в моей голове. У кого-нибудь есть совет? Или я выбираю не тот язык, чтобы начать функциональное программирование?

Ответы [ 18 ]

16 голосов
/ 03 марта 2009

Это немного похоже на езду на велосипеде, это просто тренировка. Попробуйте решить некоторые проблемы с ним, возможно ProjectEuler , и в конце концов он щелкнет.

Кто-то упомянул книгу "Маленький интриган", и это довольно хорошее чтение. Несмотря на то, что он нацелен на Scheme, реальные проблемы стоит преодолеть.

Удачи!

14 голосов
/ 03 марта 2009

Ну, для меня, я столкнулся с той же проблемой, что и вы, в начале, когда я начал делать OCAML, но хитрость в том, что вы должны начать думать о , что вы хотите от кода и не как это сделать !!!

Например, чтобы вычислить квадрат элементов списка, забудьте о длине списка и подобных хитростях, просто математически подумайте так:

  • если список пуст -> Я закончил

  • если нет, то в списке должны быть голова и хвост -> вы вычисляете квадрат головы, затем попросите свою функцию сделать то же самое с хвостом.

Просто подумайте об общем случае и базовом, а также о том, что вы отправляете данные, а не изменяете их (если только вы не хотите их изменять;)).

Удачи!

6 голосов
/ 03 марта 2009

Вы можете проверить Маленький интриган .

5 голосов
/ 28 октября 2009

Как насчет этого: http://www.defmacro.org/ramblings/lisp.html

Это очень простое, пошаговое введение в мышление на языке lisp с точки зрения обычного повелительного программиста (Java, C # и т. Д.).

4 голосов
/ 25 марта 2009

Взгляните на 99 проблем Лиспи

4 голосов
/ 03 марта 2009

Некоторые мысли о Лиспе, не относящиеся к Clojure (я не эксперт по Лиспу, поэтому я надеюсь, что они в основном правильные и полезные):

Кодирование в AST

Я мало что знаю о теории компилятора или интерпретатора, но каждый раз, когда я пишу код на Лиспе, меня поражает, что мне кажется, что он напрямую строит AST.

Это часть того, что означает «code = data», кодирование на Лиспе во многом похоже на заполнение структур данных (вложенных списков) узлами AST. Удивительно, и это тоже легко читать (с правильным текстовым редактором).

Программируемый язык программирования

Таким образом, фрагменты кода являются просто вложенными списками, а операции над списками являются частью языка. Таким образом, вы можете очень легко написать код на Lisp, который генерирует код на Lisp (см. Макросы Lisp). Это делает Лисп программируемым (сам по себе!) Языком программирования.

Это делает создание DSL или интерпретатора на Лиспе очень простым (см. Также мета-циклическая оценка ).

Никогда ничего не перезагружать

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

Продвинутый ООП

Затем большинство систем Lisp имеют своего рода объектную систему, основанную на CLOS, которая является усовершенствованной (по сравнению со многими реализациями ООП) и настраиваемой объектной системой (см. Искусство протокола метаобъекта ).

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

4 голосов
/ 03 марта 2009

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

http://www.plt -scheme.org /

Кроме того, «Структура и интерпретация компьютерных программ» Х. Абельссна, Г. Суссмана и Дж. Суссмана - очень хорошая книга, касающаяся Схемы (и программирования).

Привет

1012 * КУП *

3 голосов
/ 03 марта 2009

Просто помните: это все данные!

2 голосов
/ 04 марта 2009

Легко!

M-x lisp-mode

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

Кроме того, многие люди зацикливаются на скобках, и я не совсем понимаю, почему - синтаксис очень прост и непротиворечив, и его можно освоить за считанные минуты. Что касается меня, я пришел в Scheme после изучения C ++ и Java и всегда думал, что различие между «функциями» и «операторами» является ложной дихотомией, и было приятно видеть, что это различие устранено.

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

Наконец, я не уверен, какую поддержку имеет Clojure для макросов, но они считаются важной частью lisp. Однако я не буду беспокоиться об их изучении, пока вы не будете хорошо знакомы с вышеупомянутыми элементами - хотя макросы невероятно полезны и универсальны, они также используются реже, чем другие методы, которые я упомянул.

2 голосов
/ 03 марта 2009

Напишите несколько простых классических функций, в которых Лисп хорош, например,

  • перевернуть список

  • сказать, находится ли атом где-нибудь в s-выражении

  • напишите EQUAL, чтобы сказать, равны ли 2 s-выражения

  • напишите FRINGE, чтобы получить список атомов на границе s-выражения

  • написать SUBST, затем написать SUBLIS

  • Символическое дифференцирование

  • Алгебраическое упрощение

  • написать простой EVAL и / или APPLY

Поймите, что Lisp хорош для таких функциональных программ без побочных эффектов.

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

Что лучше для данного приложения, зависит от приложения. В общем случае она должна содержать не меньше и не больше информации о состоянии, чем это необходимо.

...