Подтвердить что ты не робот

Как заставить мой мозг двигаться в режиме lisp?

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

4b9b3361

Ответ 1

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

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

Удачи!

Ответ 2

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

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

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

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

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

Удачи!

Ответ 4

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

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

Ответ 5

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

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

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

Привет

MUE

Ответ 6

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

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

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

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

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

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

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

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

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

Расширенный ООП

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

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

Ответ 8

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

Ответ 9

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

  • изменить список

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

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

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

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

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

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

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

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

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

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

Ответ 10

Легко!

M-x lisp-mode

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

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

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

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

Ответ 11

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

Ответ 12

Моя личная практика - найти небольшой проект (что может занять 3-5 ночей) и реализовать его. Как об инструменте фильтрации блога? Возможно, это просто реализация Towers of Hanoi или Linked List (обычно это проекты на одну ночь).

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

ОГРОМНАЯ помощь принимает курс в чем-то вроде... um... LISP!:) Домашнее задание заставит вас противостоять многим концепциям, и он щелкнул меня задолго до того, как закончится семестр.

Удачи!

Ответ 13

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

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

Ответ 14

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

Затем попробуйте реализовать небольшую вещь (попробуйте сделать ее полезной для вас или у вас может не быть мотивации).

Lisp в коробке - отличный способ намочить ноги.

Ответ 15

Кто сказал, что собирается нажать? Я всегда смущен

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

:)

Ответ 16

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

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

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

Ответ 17

Я бы посмотрел Программу Clojure. Это отличная книга для не-осечек.

Ответ 18

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

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

Удачи!