LINUX.ORG.RU
ФорумTalks

Функциональщики, как у вас мозг не сломался?

 , , ,


0

5

Сижу учу Lisp. Сишность головного мозга мешает очень сильно.

Функциональщики, как вы вывернули наизнанку образ мышления в процессе программирования?

Lisp`овики, как вы не путаетесь в закрывающихся скобках, особенно, если код пишется не «по порядку», а «изнутри наружу»?

★★

Последнее исправление: zx_gamer (всего исправлений: 1)

Сижу учу Lisp. Сишность головного мозга мешает очень сильно.

Зря. Если хочешь функциональщины, возьми SML какой-нибудь.

Функциональщики, как вы вывернули наизнанку образ мышления в процессе программирования?

Лехко. Из чувства протеста, вместо сишки на первом курсе писал на лиспе, а сишку осилил уже потом.

Lisp`овики, как вы не путаетесь в закрывающихся скобках, особенно, если код пишется не «по порядку», а «изнутри наружу»?

Подсветка скобок не просто так придумана. Используй нормальный редактор.

Ещё из советов: повесь скобки на отдельные клавиши, чтобы не нужно было shift жать. У меня это сделано через xcape: xcape -e 'Shift_L=parenleft;Shift_R=parenright'.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)

Функциональщики, как вы вывернули наизнанку образ мышления в процессе программирования?

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

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)

как у вас мозг не сломался?

сломался

как не путаетесь в закрывающие скобочках?

есть тема, когда пишешь с правильным выравниванием, а скобки за тебя переставляет аддон

t184256 ★★★★★
()
Ответ на: комментарий от zx_gamer

Ocaml/F#, Erlang, Haskell(но осторожно, вызывает необратимые изменения межушного ганглия).

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

Dark_SavanT ★★★★★
()
Последнее исправление: Dark_SavanT (всего исправлений: 1)

Функциональщина хороша когда её не пихаешь везде. В крудах, например, не надо. А если будешь делать свой цсс с блекджеком и шлюхами - на императивщине затрахаешься в хвост и в гриву.

DumLemming ★★
()
Ответ на: комментарий от DumLemming

Я понимаю. В основном Си и Си++ использую. Но говорят что Lisp (и др.) позволяют по-другому мыслить и писать код (который несомненно медленнее) гораздо короче и красивее.

zx_gamer ★★
() автор топика

Забей, всё равно функциональный код тормозной и не оптимальный.

Shadow ★★★★★
()
Ответ на: комментарий от Shadow

Но, он же красивый декларативный, зачем ему скорость.

vvn_black ★★★★★
()
Ответ на: комментарий от hateyoufeel

Подсветка скобок не просто так придумана. Используй нормальный редактор.

У меня Emacs.

Что посоветуете поставить в него?

zx_gamer ★★
() автор топика
Ответ на: комментарий от zx_gamer

посоветуете поставить в него

Для скобок rainbow-delimiters, для лиспа sly.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)

Lisp`овики, как вы не путаетесь в закрывающихся скобках, особенно, если код пишется не «по порядку», а «изнутри наружу»?

paredit, smartparens, sly. В общем, Emacs.

rupert ★★★★★
()
Последнее исправление: rupert (всего исправлений: 1)

Изучал примерно одновременно с императивными C/C++, мозг не ломался (а понятия рекурсии и функций высшего порядка — они и в императивных ЯП примерно такие же).

Первое время было непривычно с акторами/OTP, но это тоже довольно быстро прошло.

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от zx_gamer

Выше уже ответили. Я же посоветую всё таки взять что-то кроме лишпа. Например, SML.

hateyoufeel ★★★★★
()
Ответ на: комментарий от zx_gamer

У меня Emacs.

У тебя ноутпад;) Ты хоть lisp-mode включил?

rupert ★★★★★
()

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

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

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


  • place-oriented programming
Nervous ★★★★★
()
Ответ на: комментарий от zx_gamer

Мыслить надо не по другому а адекватно. Императивщина не может во всё, если хз во что складываются условия и по какому пути идти - не надо писать тонны ифов, лучше лямбды-монады всякие. Хочешь лисп - подбирай задачи для лиспа

DumLemming ★★
()

Lisp`овики, как вы не путаетесь в закрывающихся скобках, особенно, если код пишется не «по порядку», а «изнутри наружу»?

Paredit и ориентируйся преимущественно по отступам, а не скобкам.

Но говорят что Lisp (и др.) позволяют по-другому мыслить и писать код (который несомненно медленнее) гораздо короче и красивее.

По-другому мыслить - это скорее к Erlang и Haskell (оба).

Gentooshnik ★★★★★
()
Ответ на: комментарий от t184256

есть тема, когда пишешь с правильным выравниванием, а скобки за тебя переставляет аддон

Это же какой-то питон получается.

Непонялно что хуже - следить за количеством отступов или подсчитывать скобочки.

Psilocybe ★★★★
()
Последнее исправление: Psilocybe (всего исправлений: 1)
Ответ на: комментарий от DumLemming

Императивщина не может во всё,

4.2 Вызывающе неверная информация.

если хз во что складываются условия и по какому пути идти - не надо писать тонны ифов, лучше лямбды-монады всякие.

И чем это лучше ссылки на фунцию? Хотя бы предмет надо освоить.

Psilocybe ★★★★
()

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

Попробуй вот такое переписать на бидоне/жабе/сисярпе, к примеру:


(defclass named-object ()
  ((name :initarg :name :reader object-name)))

(defclass asteroid (named-object)
  ()
  (:default-initargs :name "A-1"))

(defclass ship (named-object)
  ()
  (:default-initargs :name "USS-1"))

(defclass collision-settings ()
  ((id :initarg :id :reader settings-id)))

(defclass empty-settings (collision-settings)
  ()
  (:default-initargs :id :empty))

(defclass actual-settings (collision-settings)
  ()
  (:default-initargs :id :actual))

(defmethod collide ((x asteroid) (y ship) (settings actual-settings))
  (format t "Asteroid ~a collides with ship ~a"
          (object-name x)
          (object-name y)))

(defmethod collide ((x ship) (y asteroid) (settings actual-settings))
  (format t "Ship ~a collides with asteroid ~a"
          (object-name x)
          (object-name y)))

(defmethod collide :around ((x named-object) (y named-object) (settings actual-settings))
  (format t "Objects ~a and ~a are about to collide~%"
          (object-name x)
          (object-name y))
  (call-next-method))

(defmethod collide (x y (settings empty-settings))
  (format t "Empty settings. No collision is performed"))

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

Lisp`овики, как вы не путаетесь в закрывающихся скобках, особенно, если код пишется не «по порядку», а «изнутри наружу»?

В Java/C/C++/C# - скобочек по факту куда больше, плюс они неудобные и разные. Для лиспов IDE умеет нормально все подсвечивать.

lovesan ★★
()
Ответ на: комментарий от lovesan

Выше пример про ООП.

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

Метапрограммирование часто идет рука об руку с декларативностью.

Тут надо напомнить, что ФП не обязательно декларативно, и как пример - Хаскель - самый что ни на есть императивный язык, даром что чисто функциональный.

Разницу можно на примере увидеть:

Для вычисления n-го числа фибоначчи в декларативном виде, как это мы обычно и делаем на CL, мы пишем так:

(defun fib (n)
  (loop :for a = 1 :then b
        :and b = 1 :then (+ a b)
        :repeat n
        :finally (return a)))

Переписав это в функциональном стиле, мы получим такое:

(defun fib (n)
  (labels ((rec (a b n)
             (if (> n 0)
               (rec b (+ a b) (- n 1))
               a)))
    (rec 1 1 n)))

Как видим, получилось императивненько - мы задаем алгоритм, пишем его шаги, if пишем, опять же, и все такое. Очевидно, что в декларативном виде куда более читаемо.

Ну и кроме всего прочего в лиспе есть куча мелких удобных плюшек - числа нормально сделаны, итд.

lovesan ★★
()
Ответ на: комментарий от Psilocybe

Непонялно что хуже - следить за количеством отступов или подсчитывать скобочки

Скобочками редактор заведует, ничего не нужно подсчитывать. Впрочем, отступами тоже.

Nervous ★★★★★
()

Сижу учу Lisp

Надеюсь, под лиспом ты имеешь в виду Scheme? Если так, то geiser или racket-mode, в зависимости от того, что используешь. Ну и конечно paredit, без него никак.

Puzan ★★★★★
()

Функциональщики, как вы вывернули наизнанку образ мышления в процессе программирования?

Если на sh писал скрипты, то мышление легко адаптируется.

$ ls | sort | uniq | take -n 1

это как раз аналог функциональной идеи. Только в функциональных языках параметром может быть функция. Хотя в find -exec тоже.

monk ★★★★★
()
Ответ на: комментарий от Psilocybe

Твой выбор — не или-или. Ты либо следишь за выравниванием и закрываешь скобочки, либо только следишь за выравниванием.

t184256 ★★★★★
()
Ответ на: комментарий от t184256

Вообще-то нет. Если есть скобочки, то за выравниванием следит текстовый редактор. А если нет, то есть https://github.com/martin12333/Readable-Lisp-S-expressions и можно писать

defun fib (n)
  labels <* rec (a b n)
             if {n > 0}
               rec b 
                   + a b  
                   - n 1
               a *>
    rec 1 1 n
monk ★★★★★
()
Ответ на: комментарий от monk

Или вообще

fib n =
  rec a b n =
    n > 0 ?
      rec b
        a + b
        n - 1
      a
  rec 1 1 n
monk ★★★★★
()

как вы не путаетесь в закрывающихся скобках

]

untitl3d
()
Ответ на: комментарий от monk

Если есть скобочки, то за выравниванием следит текстовый редактор.

Хм. Ну может можно и так, но я лучше выберу перетекание туда-сюда скобок и удобные способы выравнивания, чем вставку скобок с последующей ездой во все стороны кода.

t184256 ★★★★★
()
Ответ на: комментарий от Nervous

Скобочками редактор заведует, ничего не нужно подсчитывать. Впрочем, отступами тоже.

Чувствую надо тут на раслабоне. Привыкли только писать, а сопровождать кто будет? Особо, когда в «полевых» условиях, то есть без удобного ИДЕ, надо внести изменения.

Язык и без специально настроенного редактора должен быть все ещё удобен.

Psilocybe ★★★★
()
Ответ на: комментарий от Psilocybe

в «полевых» условиях, то есть без удобного ИДЕ, надо внести изменения

Карандашиком в тетрадочке шоле? Нет емакса кроме емакса, какое еще ИДЕ вам нужно.

Язык и без специально настроенного редактора должен быть все ещё удобен.

А гайки без гаечного ключа не должны отворачиваться, голыми руками? %)

Посмотрел бы я, кстати, как вы на условной жабе без ИДЕ пишете, в полевых условиях (тм).

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 2)
Ответ на: комментарий от Nervous

А гайки без гаечного ключа не должны отворачиваться, голыми руками?

Гайки с колес должно быть удобно отворачивать не только пневмопистолетом, но и твоим балонником.

Psilocybe ★★★★
()

Функциональщики, как у вас мозг не сломался?

Кто тебе сказал, что он не сломался? Ты посмотри на них в жизни, в быту... Это ж пропащие существа :D

Gonzo ★★★★★
()
Ответ на: комментарий от Nervous

Посмотрел бы я, кстати, как вы на условной жабе без ИДЕ пишете, в полевых условиях (тм).

Я писал. В Vim. Не так уж и страшно.

monk ★★★★★
()
Ответ на: комментарий от monk

Так вим-то, наверное, не голый был, как блокнот. Отступы, дополнение, навигация, сборка — наверняка все это было. Чем не микроИДЕ.

Я, честно говоря, не понимаю, что значит кодить в полевых условиях. Выдали утром рандомный ноутбук без интернета, что на нем есть, в том и кодишь или что. Юзкейс мутен и непонятен.

Nervous ★★★★★
()
Ответ на: комментарий от lovesan

Попробуй вот такое переписать на бидоне/жабе/сисярпе, к примеру:

Скорее всего на жабе или сисярпе «такое» уже написано, отлажено и оформлено в виде библиотеки, доступной всем, а не должно быть написано каждым борщелисповцем, потому что он может и потому что это же так просто.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Nervous

Так вим-то, наверное, не голый был, как блокнот. Отступы, дополнение, навигация, сборка — наверняка все это было. Чем не микроИДЕ.

Почти голый. Без поддержки java. Поддержка прыгания по {} и отступа равного предыдущей строке.

Правда писать надо было немного. Всего несколько сотен строк.

monk ★★★★★
()
Ответ на: комментарий от Virtuos86

Скорее всего на жабе или сисярпе «такое» уже написано, отлажено и оформлено в виде библиотеки, доступной всем

Это на лиспе можно сделать в виде библиотеки (CLOS это именно библиотека, а не примитив языка).

В Java приходится писать новый язык: https://multijava.sourceforge.net/

monk ★★★★★
()
Ответ на: комментарий от monk

В Java приходится писать новый язык

August 17, 2006
Version 1.3.2 Released!

а оно такое востребованное или такое стабильное?

olelookoe ★★★
()
Ответ на: комментарий от wandrien

И часто нужен multiple dispatch?

Примерно как перегрузка функций в C++. Именно необходим так, что без него неудобно, достаточно редко (примерно равно потребности в паттерне Посетитель). С другой стороны, позволяет красивее писать обобщённые методы, не требуя отдельного имени для каждого типа.

monk ★★★★★
()
Ответ на: комментарий от monk

Я, честно, код не смотрел вообще. Если там множественная диспетчеризация для классов, то... в целом мои слова не меняются. Лисп — в рамочку и на стену, на память о временах, когда скобки были зелеными 😁

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Лисп — в рамочку и на стену, на память о временах, когда скобки были зелеными

История движется по кругу. Значительный кусок лиспа переизобрели в виде XML/XSLT (особенно когда на этих XML пытаются бизнес-правила писать). JS взял семантику лиспа за основу.

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

monk ★★★★★
()
Ответ на: комментарий от Virtuos86

Если взять паттерны проектирования, то на лиспе они почти все становятся однострочниками.

monk ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)