Левенчук пишет, что все серьёзные программисты мечтают программировать на фукнциональных языках. Не знаю, как серьёзные, а у меня лично никогда желания программировать на Лиспе не возникало. Нечеловеческий он какой-то. Пусть ворлоны на нём программируют.
Tags:
no subject
Главное в Лиспе не функции, а макросы. А скобочки (точнее, представление программы в виде S-выражений) — это единственный способ делать нормальные макросы.
Естественно, речь идёт не о тех макросах, которые в C/C++. В лиспе макрос — это функция, которая на входе принимает одно S-выражение, а на выходе даёт другое. Т.е. все вычислимые функции доступны, а не просто подстановки в строках, как в C.
Другое дело, что ФП более удобно для написания таких вот функций, преобразующих одно выражение в другое :) Однако в Common Lisp есть и императивный ООП, и многое другое.
И ещё, надо заметить, что тот лисп, который изобрёл МакКарти, и тот, который существует сейчас (Common Lisp, Scheme) — это две большие разницы :) Я сейчас писал про современный.
no subject
А чем, собственно, макрос отличается от фукнции, кроме имени, я не совсем понял. Я, опять же, знаю, что в лиспе всё - список, и что функция (которая, в свою очередь, тоже есть список) есть операция над списками. Мне просто кажется не всегда удобным мыслить именно в этих терминах.
no subject
2. Не всё — список. Есть ещё массивы, структуры, хеш-таблицы, объекты. Есть ещё целые произвольной точности и комплексные числа. У вас устаревшие сведения :)
3. Обычные функции работают во время работы, а макросы — во время компиляции (поэтому тут и уместна приставка мета-). Конечно, макросы могут вызывать другие функции (в этом главное отличие от большинства других макросистем).
Простой пример: для того, чтобы включить в программу на C парсер, нужно вызвать отдельную утилиту, которая описание грамматики сконвертирует в код на C. А в Лиспе для этого нужно лишь написать соотв. макрос. Другой пример — автоматическое выведение типов а-la ML.
no subject
3. Тут я не совсем понял - что значит "работают во время компиляции"? Если я на Лиспе напишу программу, которая решает квадратное уравнение - то она мне его решит при компиляции, не зная входных параметров? Нет. Или вы имеете в виду, что константные выражения в Лиспе вычисляются при компиляции? Прекрасно, ну так не только там, но не все же выражения - константные.
Простой пример: для того, чтобы включить в программу на C парсер, нужно вызвать отдельную утилиту, которая описание грамматики сконвертирует в код на C. А в Лиспе для этого нужно лишь написать соотв. макрос.
Пример непонятен. Это значит, всего лишь, что в C компилятор или там yacc не входит в RTL, а в Лиспе - входит. Ну, отлично. Уверен, что в RTL в C есть вещи, который в RTL Лиспа нет. Однако что это должно продемонстрировать мне, вот чего я не пойму - что RTL у Лиспа лучше? Ну, хорошо, лучше.
no subject
Не константные. Любые. Во время компиляции доступен ВЕСЬ язык. Которым можно компилятор расширять как угодно.
no subject
no subject
Всё же, рекомендую статью прочитать.
no subject
Макросы принимают на входе данные, но генерируют код. Например, данные — грамматика, а код — парсер.
А парсер не входит в RTL Лиспа. Я не понял последний абзац. RTL вообще не причём :)
Смысл в том, что можно расширять компилятор Лиспа. Например, добавить парсер. И это ещё не самое впечатляющее.
no subject
no subject
> А чем, собственно, макрос отличается от фукнции, кроме имени, я не совсем понял.
Может, моя статейка поможет разобраться:
http://arxiv.org/abs/cs.PL/0409016
> Мне просто кажется не всегда удобным мыслить именно в этих терминах.
Лисп позволяет мыслить в любых терминах, на любом уровне абстракции. Как и любой другой метаязык.
ага, а вот и флейм!
это неверно.
главной бядой CL являются сектанты вроде фанатов ¨языка¨ Scheme, которые на голубом глазу сообщают лисподевственным людям херню вроде процитированного выше отрывка.
Re: ага, а вот и флейм!
P.S. Вообще-то я предпочитаю CL Схеме, за инкрементальную компиляцию. За неё можно простить даже раздельные пространства имён для функций и всего остального...
Re: ага, а вот и флейм!
дяденька! окащенять меня бесполезно, я в этом деле нетренированный. я HyperSpec читал, покуда вы в федошной песочнице друг другу письки показывали и Y-combinator трактовали.
отсутствие хвостовой рекурсии в стандарте CL — это не ¨бяда¨, это вполне сознательный фичер.
> За неё можно простить даже раздельные пространства имён для функций и всего остального
каковые тоже есть сознательные фичеры. которые мне очень нравятся, кстати. если бы я всосал Y-combinator с молоком лямбда-матери и был бы академик, моё мнение могло бы быть и другим. в чём я совершенно не сомневаюсь, впрочем, так это в том что в подобном случае я полностью отдавал бы себе отчёт об отличии академии от реального мира, и не выдавал бы свои предпочтения за истину в последней инстанции.
Re: ага, а вот и флейм!
Фигнанына. Это ни разу не сознательное, а только лишь вынужденное решение. И практически все *вменяемые* компиляторы CL таки хвостовые рекурсии разворачивают. Однако:
a) закладываться на это НЕЛЬЗЯ, так как "практически" - это не "все"
b) в силу этого, ФУНКЦИОНАЛЬНО писать на CL - тоже нельзя (да и на фиг не надо), всегда, когда глубина рекурсии непредсказуема, она должна заменяться на цикл.
Имеешь что либо супротив возразить - вперёд. Иначе - не хер вякать.
Re: ага, а вот и флейм!
создатели стандарта безусловно знали о хвостовой рекурсии, и не стандартизивовали её сознательно. не потому что не могли, а потому что не хотели.
по крайней мере я склонен интерпретировать публичные высказывания того же Кента Питмана на данную тему именно таким образом (и несложный поиск на Google Groups с соответствующими ключевыми словами мне свидетель).
если есть свидетельства обратного, то давай их сюда.
> практически все *вменяемые* компиляторы CL таки хвостовые рекурсии разворачивают
и правильно делают, ибо это вполне приятная и недорогая для компилятора оптимизация. но заметь также, что ни один *вменяемый* компилятор не производит этой оптимизации когда (> debug optimize), что характерно.
> в силу этого, ФУНКЦИОНАЛЬНО писать на CL - тоже нельзя (да и на фиг не надо)
золотые слова, в скобочках-то!
Re: ага, а вот и флейм!
Я понял так: не хотели заставлять тех, кто не может. То есть, сочли это не обязательным требованием. Откуда и вышеизложенные выводы.
> но заметь также, что ни один *вменяемый* компилятор не производит этой оптимизации когда (> debug optimize), что характерно.
Да нет, тому же OCaml по сараю, он всегда развернёт.
> золотые слова, в скобочках-то!
Так я вообще не понимаю, об что мы таки спорим. Лисп - не функциональный язык, на Лиспе и нельзя писать чисто функционально, да и не для того он нужен, чтоб чисто функционально писать. С этими утверждениями тут хоть кто-то не согласен?!?
Re: ага, а вот и флейм!
вполне возможно, что кто-то и не мог.
факта явно осознанного предпочтения это не отменяет.
> тому же OCaml по сараю
а кто говорит про, прости оссподи, O'Caml?
> Так я вообще не понимаю, об что мы таки спорим
а мы не то чтобы и спорим. просто я пытаюсь пояснить тебе явную неуместность мелкого сектантского миссионерства в данном контексте. плюс по поводу данной конкретной темы слегка наболело: откуда, по-твоему, у человека ¨знания¨ о лиспе на уровне ¨всюду списки, рекурсия и скобочки¨? от таких вот умников, которые вместо того чтобы рассказать что-нибудь существенное, с блеском в глазах гонят телеги про хвостовую рекурсию и прочую откровенную (для девственной аудитории) эзотерику.
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
Re: ага, а вот и флейм!
опять об тоже место
Re: опять об тоже место
Re: опять об тоже место
Re: опять об тоже место
Re: опять об тоже место
Re: опять об тоже место
Re: опять об тоже место
Re: ага, а вот и флейм!
Re: ага, а вот и флейм!
Scheme — безусловно, весьма интересный академический эксперимент, воплотивший в жизнь многие на тот момент сырые и неопробованные идеи, за что ему большое спасибо. пользоваться же я всё-таки предпочитаю CL.
Re: ага, а вот и флейм!
Но ещё более предпочёл бы CL с некоторыми фичами Схемы.
no subject
Ну да. Ассемблер тоже, что тривиально доказывается тем фактом, что любую программу для компьютера можно привести к ассемблерной программе :)
Однако когда мне говорят, что на определённом языке можно писать в абсолютно любом стиле - то я отношусь к этому с определённым недоверием, даже не будучи экспертом по этому языку. Но, возможно, я неправильно вас понимаю - что значит "метаязык"?
А за статейку спасибо, неприменно прочту.
no subject
А что же в этом такого странного? Мне и в голову не приходило, что сей факт кого-то в принципе может удивлять.
> Но, возможно, я неправильно вас понимаю - что значит "метаязык"?
Это значит, что язык - расширяемый. Ему можно как угодно менять синтаксис и семантику. То есть, Лисп можно очень легко и непринуждённо превратить в *любой* язык. Обычно, на основе Лиспа делают маленькие языки, заточенные под преметную область, на которых соответствующие задачи решаются тривиально.
no subject
А не получится на Прологе писать императивно - её, императивности, там просто нет, как нет родной реализации, ну скажем, regexp engine на Прологе - в виде иллюстрации факта неимперативности. Bindings к Сишным реализациям - есть, своей - нет. Пролог вообще специфичный язык, предназначенный решать эффективно одну-единственную задачу - перебор множества решений.
no subject
no subject
основным занятиям академиков вообще является морочить голову щедрым и не очень сообразительным грантодавателям, однако не все академические результаты бесполезны.
на универсальный языл программирования Пролог, мягко скажем, не тянет. но польза от него есть.