Как мне заставить свой мозг работать в “шепелявом режиме”?

StackOverflow https://stackoverflow.com/questions/606533

Вопрос

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

Это было полезно?

Решение

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

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

Удачи вам!

Другие советы

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

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

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

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

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

Удачи вам!

Вы могли бы проверить Маленькая Интриганка.

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

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

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

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

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

С уважением

муэ

Взгляните на 99 Шепелявых проблем

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

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

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

Это часть того, что означает "код = данные", кодирование в Lisp во многом похоже на заполнение структур данных (вложенных списков) узлами AST.Потрясающе, и к тому же его легко читать (при правильном использовании текстового редактора).

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

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

Это делает построение DSL или интерпретатор на лиспе - это очень просто (см. Также метакруговая оценка).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • напишите простую ОЦЕНКУ и / или ПРИМЕНИТЕ

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

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

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

Полегче!

M-x  lisp-mode

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

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

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

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

Я бы начал с языка, который можно интерпретировать.Я нашел Москва МЛ это будет довольно просто.Это облегченная реализация стандартного ML.

Моя личная практика заключается в том, чтобы найти небольшой проект (на взлом которого может уйти 3-5 ночей) и реализовать его.Как насчет инструмента фильтрации блогов?Может быть, просто реализация Ханойских башен или связанного списка (обычно это проекты продолжительностью в 1 ночь).

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

ОГРОМНАЯ помощь - пройти курс обучения чему-то подобному...um...ШЕПЕЛЯВИШЬ!:) Домашнее задание заставит вас столкнуться со многими концепциями, и для меня это стало ясно задолго до окончания семестра.

Удачи вам!!

Удачи.Мне потребовалось пройти примерно половину курса "Языки программирования" в колледже, прежде чем Схема "щелкнула".Однако, как только это произошло, все сразу обрело смысл, и я влюбился в функциональное программирование.

Напишите интерпретатор Lisp на лиспе.

Если вы еще этого не сделали, почитайте о том, что делает lisp уникальным языком.Если вы не сделаете этого первым, вам придется пытаться делать то же самое, что вы могли бы делать на некоторых других языках программирования.

Затем попробуйте реализовать какую-нибудь мелочь (постарайтесь сделать ее полезной для вас, иначе у вас может не хватить мотивации).

Шепелявость в коробке это отличный способ промочить ноги.

Для меня важно убедиться, что вы все делаете "шепеляво".Не поддавайтесь искушению подумать: "В Java я бы использовал цикл for здесь, как мне сделать циклы for в Lisp?" но чтобы просмотреть достаточное количество примеров и руководств (как кто-то указал, SICP идеально подходит для этого), который вы можете начать замечать, когда код выглядит "лисповским", и распознавать общепринятые языковые парадигмы.

Мне, конечно, знакомо чувство, когда смотришь на какой-то код, который я только что написал, и интуитивно понимаешь, что он правильно идиоматичен для данного языка и платформы / фреймворка - вот, я думаю, когда он "щелкает".

Редактировать:И слава богу, что вы выбрали функциональный язык, меньшие студенты просто сделали бы это на Java :)

Кто сказал, что это сработает? Я всегда в замешательстве

Но если вы подумаете о том, сколько абстракции можно спрятать за макросами lisp.Тогда ваш мозг взорвется.

:)

Я бы посмотрел на Programming Clojure.Это отличная книга для тех, кто не говорит шепотом.

В дополнение к тому, что уже предложили другие разработчики, вот мои 2 цента:

  1. Начните изучать язык и попробуйте решить несколько простых числовых задач / задач для хобби на этом языке
  2. ВАЖНЫЙ: Опубликуйте решение / код в StackOverflow, спросив мнение людей, действительно ли это шепелявый способ чтобы сделать это.

Желаю удачи!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top