LINUX.ORG.RU

Почему на Common Lisp пишут в императивном стиле?


0

1

Недавно начал читать PCL (до этого изучал Scheme) - не могу привыкнуть к императивщине. По-моему, Лисп просто создан для того чтобы быть функциональным языком программирования :)

Связано ли это как-нибудь с тем фактом, что CL является «промышленным стандартом» Лиспа?


Ответ на: комментарий от linuxfan

> Что в нем сложного?

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

б) куча мелочей, без которых разработка не возможна. Сравни, например, со схемой.

в) а так, да, С прост, вместе с брейнфаком, унлябдой и иными.

сказать машине на понятном [машине] языке,

поправлено.

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

> питоне, жабе или похапе

«клевых фунциональных языках»

я один вижу тут противоречие

декодеров видео, плагинов для обработки изображений

это как раз 0.0004% из тех 0.001%, о которых я говорил выше.

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

А функция по-твоему может быть объектом? А объект функцией?

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

Объекты появляются там, где появляется присваивание. Поэтому чисто формально, в голом Си, переменная типа int - это объект, так как понятие присваивания для нее имеет смысл. В питоне благодоря возможности присваивания, возможно переменной присвоить функцию, что делает функцию объектом. Функция может имитировать состояние и присваивание (замыкания, монады и тд), поэтому она может имитировать объекты, при этом САМА объектом может и НЕ являться. Такие дела.

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

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

> все обречены втаскивать имеративные алгоритмы в чистый мир функций.

главное не забыть загнать императивщину за монады.

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

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

Дело не в сложности языка.

http://kawais.org.ua/shlez.html

Длинно, но ИМХО интересно. Из «Десять лекций по статистическому и структурному распознаванию образов.»

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

>Объекты появляются там, где появляется присваивание...

Ты настолько уныл, что мне лень делать лицопальму.

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

>http://kawais.org.ua/shlez.html

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

Также, когда я писал о простоте, я учел и то, что во многих ЯВУ реализованы многие повседневные нужды в почти готовом виде. То же использование регулярных выражений в перле куда удобней, чем в C. Но не смотря на это, C значительно проще перла.

linuxfan
()
Ответ на: комментарий от tailgunner

>Лисп создали 50 лет назад!

Кстати, за эти 50 лет лисп так и не осилил ничего полезного: даже с многопоточностью беда.

linuxfan
()
Ответ на: комментарий от Waterlaz

Ты настолько уныл, что мне лень делать лицопальму.

И правильно. В SICP, тут народ правильно подсказывает, хорошо этот вопрос освещен.

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

В одном случае отличия чисто количественные. С как был макроассемблером так им и остался. А вот трансформация в семействе лиспов носила качественный характер.

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

>а) необходимость следить за мелочами и концентрироваться на особенностях работы компа, а не на решаемой задаче.

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

б) куча мелочей, без которых разработка не возможна. Сравни, например, со схемой.

Да легко: под схему нет библиотек. Мне нужен SOAP. Где он в схеме? Мне нужно эффективное мультиплексирование IO. В C у меня есть libevent или libev, а в схеме? Отсутствие библиотек — смертный приговор. Будь любой язык хоть архимегаклевым, но если в нем строительство велосипеда начинается с первых строк программы, у такого языка нет будущего.

Посмотри на цветущие жабопитоны и дотнеты: в них есть практически все, поэтому их удобно использовать: берешь и пишешь. В C ты точно так же берешь и пишешь, просто машина тупая, а задача сложная — нужно описать все нюансы. В итоге ты со своей клевой схемой все еще строишь велосипеды (а их еще и обкатать нужно!), а я уже все написал на C.

в) а так, да, С прост, вместе с брейнфаком, унлябдой и иными.

Да неужели? Напиши-ка мне деление на брейнфаке, а я посмеюсь.

linuxfan
()
Ответ на: комментарий от ugoday

>Расскажи нам, что ты знаешь о CL.

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

linuxfan
()
Ответ на: комментарий от Waterlaz

Либо ты так задорно сарказмишь, либо пишешь полный бред. Если ты все это говоришь серьезно, то говно на самом деле у тебя в голове вместо мозгов. /me искренне надеется, что это не так.

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

>Это всё?

Прокомментируй для начала написанное. Или как всегда возразить нечего, но скобочками побряцать охота?

linuxfan
()
Ответ на: комментарий от dmitry_vk

Безусловно это правда(как обычно, с кучей оговорок, конечно же, как и в любом разговоре про ООП). Но ведь не каждый функциональный язык позволяет реализовывать объекты с передачей сообщений. Скажем прямо, функциональный == без побочных эффектов, к этому передачу сообщений или полиморфизм с наследованием не привязать. Ортогональные понятия же.

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

>Возможно, тебе просто нравится заниматься рутиной. Это нормально, многие люди делают это.

Позаниматься рутиной иногда полезно, особенно когда решаешь задачу её автоматизации.

SV0L0CH
()
Ответ на: комментарий от linuxfan

> Полагаю, для низших умов это может казаться чем-то сверхсложным

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

Да легко: под схему нет библиотек

Мы сейчас говорим о языке. Не забыл? Как же ты пишешь на С, если даже тему разговора не способен удержать в памяти.

Мне нужен SOAP...

И тут приходит толстая и успешная Жаба, а старичок С уходит плакать на городское кладбище.

Да неужели? Напиши-ка мне деление на брейнфаке, а я посмеюсь.

Дружок, если я попрошу тебя реализовать пару СЛ-фишек на С --- вот это будет истинная бугогашенька.

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

>Мы сейчас говорим о языке. Не забыл? Как же ты пишешь на С, если даже тему разговора не способен удержать в памяти.

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

И тут приходит толстая и успешная Жаба, а старичок С уходит плакать на городское кладбище.

Правда чтоли? А мужики-то используют gsoap и проблем не знают. В C есть библиотеки абсолютно для всего. Просто потому что это Язык Программирования, плод больного воображения теоретиков.

Дружок, если я попрошу тебя реализовать пару СЛ-фишек на С --- вот это будет истинная бугогашенька.

Снова начались заунывные песни о лямбдах и функциях как объектах первого уровня? Да кому это академического говно нужно?

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

> Что у него куча несовместимых между собой реализаций.

Как и у С.

Что его самый свежий стандарт древнее окаменелого говна мамонта

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

и абсолютно не учитывает таких насущных вещей как многопоточность.

Интересно. А почему ты думаешь, что это должно быть в стандарте?

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

Ерунда.

а CL без макросов просто очередное унылое префиксное говно.

Глупость.

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

Да. Конечно. Разработчики оптимизирующих компиляторов должны знать толк в рутине. Я-то тут при чём?

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

Но ведь не каждый функциональный язык позволяет реализовывать объекты с передачей сообщений. Скажем прямо, функциональный == без побочных эффектов, к этому передачу сообщений или полиморфизм с наследованием не привязать. Ортогональные понятия же.

эээ... что? при чём тут побочные эффекты?

parent "msg-0" = 0
parent "msg-1" = 1
parent "msg-2" = 2
parent  msg    = error $ "Unknown message: " ++ msg

child "msg-0" = 0.0
child  msg    = parent msg
korvin_ ★★★★★
()
Ответ на: комментарий от linuxfan

>Если ты самостоятельно сформулируешь, почему C сложен, будет намного лучше.

Я не говорил, что С сложен.

Римские числа, кстати, проще десятичного представления.

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

> И почто мне твой язык

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

В C есть библиотеки абсолютно для всего.

Наводящий вопрос: про foreign function interface слышал?

Снова начались заунывные песни о лямбдах и функциях как объектах первого уровня?

Решил отмазаться заранее? Это ты правильно. Примитивным язычкам лучше избегать прямого сравнения с лиспом.

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

>Либо ты так задорно сарказмишь, либо пишешь полный бред. Если ты все это говоришь серьезно, то говно на самом деле у тебя в голове вместо мозгов. /me искренне надеется, что это не так.

=) Я думал, что такая толщина уже не будет вызывать никаких сомнений. Видать ошибался.

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

Ты неправильно понял мысль balodja кмк.

balodja имел ввиду, что наличие/отсутствие побочных эффектов слабо вяжется с наличием/отсутствием передачи сообщений. То есть одно их другого не следует и одно другому не мешает.

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

>А в лиспах любой программист может дополнить язык как он хочет.

Вот это и затрудняет поддержку лиспового кода другими разработчиками. Особенно когда язык дополняется именно макросами(то же самое и для C).

SV0L0CH
()
Ответ на: комментарий от Waterlaz

ну мб. как-то он сумбурно её выразил, всё смешал

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

И много ты лиспового кода поддерживал, раз так уверенно об этом говоришь?

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

мир параллелен, распределён, и основывается на обмене сообщениями; императивного в нём не больше, чем функционального или логического

Мир статичен. Все варианты развития событий уже существуют, человек просто движется сквозь свою проекцию мультиверса.

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

> Мир статичен. Все варианты развития событий уже существуют,

человек просто движется сквозь свою проекцию мультиверса.


Сразу видно, что квантовую механику тебе как следует не преподавали ;)

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

Сразу видно, что квантовую механику тебе как следует не преподавали ;)

Квантовая механика тут не при чём. Это из Дойча.

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

>> Мир статичен. Все варианты развития событий уже существуют,

человек просто движется сквозь свою проекцию мультиверса.

Сразу видно, что квантовую механику тебе как следует не преподавали ;)

Не вижу, как квантовая механика тут противоречит сказанному.

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

> при чём тут побочные эффекты?

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

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

Пардон. Просто на ЛОРе всякое можно встретить, поэтому сомнений куча, да. Постараюсь в следующий раз их отбросить :)

balodja ★★★
()

Можно я влезу? Спасибо.

В императивном подходе ты описываешь что машине делать, по пунктам. В функциональном — описываешь задачу, часто в математических терминах.

Иногда удобнее одно, иногда — другое, и хорошо, когда можно это сочетать. Но второе благотворно отражается на мозгах, даже таких не-программистов как я :)

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

> В функциональном — описываешь задачу, часто в математических

терминах.


По большей части байки.

Но второе благотворно отражается на мозгах


Особенно это, самая раздутая сплетня.

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

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

не надоело одну и ту же клоунаду со своей постoянной мантрой в каждом лиспотопике повторять? тебя в детстве лисп жестоко обидел? игрушки отбирал? ай-яй-яй.

CL-USER
()
Ответ на: комментарий от mv

Мир статичен. Все варианты развития событий уже существуют, человек просто движется сквозь свою проекцию мультиверса.

а геометрия реального мира - метасимплектическая, размерности 248 :)

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

Гы-гы. Точно, все так и есть.

В общем более-мене адекватные комменты в этом треде поступают только от товарища archimag. Сразу видно - человек реально пробовал писать на чем-то маргинальном.

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

>Ну отсутствие побочных эффектов — это же самый непосредственный смысл слова «функциональный».

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

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

>>А функция по-твоему может быть объектом? А объект функцией?

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

Почему нет? Одного контр-примера достаточно, чтобы усомниться в твоем тезисе о противоположности ФП и ООП. Я правильно понимаю, что Скалу ты не учил? Да и как функции (замыкания) реализованы в F# на уровне IL, скорее всего, тоже не знаешь? Да будь ФП и ООП противоположными, таких бы гибридных языков не было.

dave ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.