LINUX.ORG.RU

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


0

1

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

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


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

>у меня есть 2 проекта, но я тебе их не покажу. :p

А у меня курсач на ассемблере был, за который я получил пятерку. И что с того? Ассемблер коммерчески успешен?

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

А что ты? Кроме скриншота с быдлолипокодом в емаксе ничего не известно.

Малчег разочаровался в лиспе, ведь там if есть.

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

А у меня курсач на ассемблере был, за который я получил пятерку. И что с того? Ассемблер коммерчески успешен?

Если ты его продал (или купил :), то да. Я, кстати, много денег заработал на жертвах тренда «программист - это модно» их ассемблерных курсовиках, поэтому он для меня был определённо коммерчески успешен :)

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

> Малчег разочаровался в лиспе, ведь там if есть.

зато он крут, он кусач по асму на пять сдал

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

Черт. Я вот сейчас студентам работы по лиспу и хаскелю за деньги делал. А вот по Си как-то не востребовано. Так что Си уже давно коммерчески не интересен.

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

>Если ты его продал (или купил :), то да.

Если я регулярно менял лабораторные по ассемблеру на секс у студенток гуманитарных специальностей, это считается за коммерческий успех?

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

Если я регулярно менял лабораторные по ассемблеру на секс у студенток гуманитарных специальностей, это считается за коммерческий успех?

Так никто не давал? Бедный...

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

> Так никто не давал? Бедный...

Гы, сам это хотел спросить. Он кажется не понимает, насколько себя опускает такими словами.

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

Гы, сам это хотел спросить. Он кажется не понимает, насколько себя опускает такими словами.

И вот ещё что интересно: на какой такой гуманитарной специальности преподают ассемблер?

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

>Он кажется не понимает, насколько себя опускает такими словами.

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

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

Ну а чем мне их было брать? Мослами под грязным свитером?

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

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

>Неужто не было других качеств, кроме как писательство на ассемблере?

Были конечно же: мог еще на дельфи, java и c++.

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

Были конечно же: мог еще на дельфи, java и c++.

Нда...

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

> Я согласен, что секс хуже денег. Но вполне себе валюта.

Уж по-любому лучше пива.


Я тебе скажу просто: ты откровенное уёбище. И дело не в обмене, которого, конечно, не было, а в самом отношении. Я так понимаю, что до сих пор никто не даёт. Ну это и понятно, кто ж такому даст.

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

>Я тебе скажу просто: ты откровенное уёбище.

Гхм, ты так раздосадован от того, что даже в самых смелых фантазиях за мега-продукт на лиспе дают лишь миску риса? Или кто-то из твоих знакомых рассказывал тебе о чудовище с физтеха, питающегося девственницами с соцфака?

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

> При том, что у меня хватает честности не называть курсовую работу «проектом».

дурачок, с чего ты взял, что я студент? ха-ха-ха

все с тобой ясно, больше внимания на твои выпады/бредни обращать не буду. свободен.

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

Хорошо, давай буду объяснять на пальцах, итак, предложение обменивать курсовые на ассемблере на секс означает:

1. Ты абсолютно не уважаешь себя и не видишь в себе никаких достоинств, кроме как умение делать курсовые на ассемблере.

2. Омерзительно относишься к женщинам, а значит и вообще к людям. Просто уёбище, как я сказал выше.

3. У тебя не было и, очевидно, нет денег на проститок.

4. Если баба готова переспать ради корыстных целей (такие бывают), то она лучше выберет более подходящий объект, например фирзука (физруки у нас всемогущи). Если баба готова переспать за курсовую, то кроме исключительной тупости она должна обладать ещё соответствующими внешними данными (что не встанет даже у физрука). Бедняга.

5. Откровенно врёшь, ибо с такими уёбищем (см. выше) ни одна, пусть даже самая страшная и тупая, баба спать не будет.

6. Ты исключительно туп, если сам этого не понимаешь. Поэтому денег на проституток (ведь нормальные бабы не дают) у тебя и не будет.

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

>1. Ты абсолютно не уважаешь себя и не видишь в себе никаких достоинств, кроме как умение делать курсовые на ассемблере.

Еще я считаю, что классно пишу на C.

3. Если баба готова переспать ради корыстных целей (такие бывают)

Какой же ты идеалист. Это хорошо, если хотя бы ради корыстных целей, а то ведь и «запросто так» бывает.

Если баба готова переспать (* автор пропустил «с тобой» *) за курсовую, то кроме исключительной тупости она должна обладать ещё соответствующими внешними данными (что не встанет даже у физрука).

Ты недооцениваешь мой завораживающий горящий взгляд и очаровательный потертый свитер.

6. Ты исключительно туп, если сам этого не понимаешь.

«Ты тупой, если не понимаешь, что ты тупой». Какой пассаж! Снимаю шляпу!

linuxfan
()

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

Minoru ★★★
()

я тоже регулярно меняю лабораторные по информатике на секс у студенток гуманитарных специальностей

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

>А возможно ли скомпилировать код на CL свободным компилятором в бинарник, занимающий менее 20 мегабайт и запускающийся менее 1 секунды?

Если устроит 12 мегабайтов (для x86-64) и 1.4 секунды, то http://lisper.ru/articles/hello-world-with-cl-gtk2

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

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

В CL компилятор входит в состав стандартной библиотеки - в виде функций сompile и compile-file. Первая на выходе дает функцию, вторая - fasl-файл(в случае с компиляторами в машинные коды(например, SBCL), в этом файле находятся некоторые метаданные и собственно сами машинные коды).

Размер fasl'ов обычно довольно небольшой, хотя это зависит от компилятора и от размера кода. Время загрузки же зависит, по факту, _только_ от количества и вида кода, исполняемого в этом файле в top-level во время загрузки[т.н. load-time]. Например, файл, содержащий только одну форму - (loop), несмотря на микроскопический размер fasl'a, будет загружаться вечно.

Кроме fasl-файлов существует еще одно представление кода, и, впрочем, не только кода, на лиспе, вне работающей лисп-системы - слепок состояния лисп-системы в некий конкретный момент времени. Этот слепок, соответственно, содержит в себе как минимум стандартную библиотеку CL.

В современных реализациях CL в этот слепок обычно можно добавить и рантайм лисп-системы(то самое, что в, к примеру, вышеупомянутом SBCL, находится в файле sbcl[.exe] - минимально необходимый набор низкоуровневых процедур для работы со стеком, тредами, вводом/выводом и прочей интеграцией с операционной системой[и/или с непосредственно железом]), чтобы сделать сам слепок исполняемым файлом.

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

Внимание, вопрос - есть ли еще вопросы?

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

в школе в 2м классе проходят такую тему «решения задач сложными вырожениями со скобками» один мальчик подумал что ето особеено сложно и круто и начал писать 1но длинноое выражение на каждаю задачу а я был прошареный и понял что тут фанатизм не уместен, во многих дадачах если промежуточные разультаты записывать и несколько раз использовать в дальнейшем можно сильно секономить на умножении и делении в столбик тот мальчик потом перешел в школу для одаренных детей и сошел там с ума а я счас с вами умный добрый красивый и богатый

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

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

Там есть и другая оптимизация (которой нет в SBCL и CCL) — общие части лиспового рантайма (пакет COMMON-LISP, например) не дампятся в образ, а сохраняются отдельно — прямо как shared objects для С.

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

тоже круто, да.
Проблема только в зверских ценах и лицензиях.

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

Ещё нужно добавить что, на данный момент, на сохранение в fasl-ы как на способ дистрибьюции рассчитывать нельзя - стандартного ABI у них нет и они «портятся» при первом обновлении реализации. У SBCL, например, в fasl-ах абсолютные адреса функций - образ обновился, адреса изменились, fasl-ы больше не работают.

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

>2. Омерзительно относишься к женщинам, а значит и вообще к людям. Просто уёбище, как я сказал выше.

а зачем к ниму по другому относится? человеки должны быть уничтожены!

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

Во-первых, ты все-равно привлекаешь CLOS. А значит неявная типизация, динамика и позднее связывание.

Во-вторых, DSL у тебя очень простой. А вот если брать не простой, то становится понятно зачем существуют лексеры, парсеры, генераторы AST, анализаторы AST и кодогенераторы. Лисп тут не улучшает и не ухудшает ситуацию.

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

В четвертых, для некоторых компиляторов можно писать свои плагины. Хотя, это не особо практикуется.

Лисп хорош до определенного момента.

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

При загрузке делается fixup.

Да, а при сохранении используются fop, но fasl-ы всё равно не стабильны - особенно это чувствуется при разработке, можно хоть «удалить все фаслы» на гномо-панель ставить :) Это скорее средство кэширования бинарного кода, чем бинарные модули которые можно распространять. Хотя, по сравнению с os-compatible-shared-objects, tree-shaking или multi-cores сделать из fasl-ов разделяемые бинарные модули которые были бы стабильны в широком диапазоне версий - выглядит проще всего по трудозатратам, они уже есть и они уже разделяемые, им бы ещё небольшое ABI и можно будет распространять программы и в бинарном виде и экономно с точки зрения размера.

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

>Во-первых, ты все-равно привлекаешь CLOS. А значит неявная типизация, динамика и позднее связывание.
CLOS там при компиляции, если спецификации типов константны.

Во-вторых, DSL у тебя очень простой.

Да, потому что S-выражения, и с виду он смотрится очень просто.

А вот если бы не - пришлось бы привлекать тонны вот это вот говна:

лексеры, парсеры


А вот это:

генераторы AST, анализаторы AST и кодогенераторы.

У меня внутри, при компиляции, на CLOS. Все очень клево.

Лисп тут не улучшает и не ухудшает ситуацию.

Улучшает.

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

Ага, а еще для доступно программирование в терминах тормозов.

В четвертых, для некоторых компиляторов можно писать свои плагины.

Хотя, это не особо практикуется.


Потому что это костыли и просто жопа.

Лисп хорош до определенного момента.

Лисп хорош всегда, кроме случаев когда он не очень хорош(системное программирование, в основном).

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

Что такое multi-cores?

На основе SBCL'евских fasl'ов не сделать бинарно распространяемые программы. fasl'ы содержат скомпилированный код, в том числе конкретную реализацию VOP'ов, которые меняются. Хотя в CMUCL fasl'ы были совместимыми (точнее, были стабильные версии fasl'ов). На самом деле, я плохо себе представляю, как в SBCL может быть реализовано бинарное распространение — ABI довольно нестабильно между версиями, а выделить стабильный «общий знаменатель» довольно сложно, т.к. SBCL быстро меняется.

Так что tree-shaking (или вообще разделение образа на разные части) выглядит гораздо проще.

dmitry_vk ★★★
()

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

Видимо, по причине свойств мозга. Кто-то выразил это примерно так «люди готовы сколь угодно долго выполнять самую тяжёлую и нудную работу, лишь бы избежать мучений, связанных с необходимостью думать». По этой причине с детства люди привыкают «делать»¹. Декларативное программирование требует неестественного умения — «думать»¹. Последнее довольно трудно развить до состояния привычки. Результат - subj

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

DonkeyHot ★★★★★
()
Ответ на: Почему ... пишут в императивном стиле от DonkeyHot

Именно так, надо выдавливать из себя [s]раба[/s] привычку писать интерактивно. Nota bene Использование dsl как loop и iterate я никак к императивному программированию отнести не могу.

В R изумительныая не эффективность for естественным образом поощряет писать (x)apply(), что радует :) В результате как правило получается проще, яснее и короче.

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

Что такое multi-cores?

Я имел ввиду использование нескольких образов, так в некоторых реализациях Smalltalk можно. Т.е. это не разделяемый код это просто возможность вернутся в ту раннюю процедуру загрузки образа позже (и уже для загрузки другого образа). Но не представляю как это может быть сделано для SBCL.

Так что tree-shaking (или вообще разделение образа на разные части) выглядит гораздо проще.

А вот разделяемый код - если OS compatible, т.е. в формате ELF/PE/Mach-O, это потребует как-то преобразовывать код (в том числе calling convension) в такой формат, потому что он туда просто так не входит - например JMP на функции в таких форматах должны быть CALL-ами. А если делать свой разделяемый бинарный модуль, то это станет похоже на реимплементацию fasl-ов - вот мне и кажется, не проще ли допилить fasl-ы, чем сделать что-то подобное (но стабильное) с нуля?

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

>То есть, в данном конкретном случае, узнавать из документации, что

lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, lpEnvironment и lpCurrentDirectory - необязательные параметры

а lpProcessInformation аж выходной, и его надо занести не в список аргументов, а в список возвращаемых значений функции


что lpStartupInfo может быть указателем на STARTUPINFOEX


что флаги в dwCreationFlags это комбинация констант из вполне четко заданного списка, и что его желательно маршаллить как список из имен этих констант, а не как тупой dword

что нам не надо два варианта функции(CreateProcessW и CreateProcessA), а надо одну, имя который определялось бы при компиляции

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


и что при возврате функцией нуля надо обязательно проверить GetLastError и кинуть соответствующее исключение



лицопальма.Inproc.COM.Win32.

В KLEE что-то было насчёт theorem prover'а. Если что-то из указанного удасцо запрограммировать в виде теста для стат. анализа, может быть WIN.

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