March 2026

S M T W T F S
12 34567
891011121314
151617 18192021
22232425262728
293031    

Style Credit

Expand Cut Tags

No cut tags
Thursday, May 5th, 2005 12:10 am
Левенчук пишет, что все серьёзные программисты мечтают программировать на фукнциональных языках. Не знаю, как серьёзные, а у меня лично никогда желания программировать на Лиспе не возникало. Нечеловеческий он какой-то. Пусть ворлоны на нём программируют.
Tags:
Friday, May 6th, 2005 08:45 am (UTC)
Лисп — это язык метапрограммирования. Это я вам как лиспник говорю.

Главное в Лиспе не функции, а макросы. А скобочки (точнее, представление программы в виде S-выражений) — это единственный способ делать нормальные макросы.

Естественно, речь идёт не о тех макросах, которые в C/C++. В лиспе макрос — это функция, которая на входе принимает одно S-выражение, а на выходе даёт другое. Т.е. все вычислимые функции доступны, а не просто подстановки в строках, как в C.

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

И ещё, надо заметить, что тот лисп, который изобрёл МакКарти, и тот, который существует сейчас (Common Lisp, Scheme) — это две большие разницы :) Я сейчас писал про современный.
Friday, May 6th, 2005 09:58 am (UTC)
1. Нет, не является :)
2. Не всё — список. Есть ещё массивы, структуры, хеш-таблицы, объекты. Есть ещё целые произвольной точности и комплексные числа. У вас устаревшие сведения :)
3. Обычные функции работают во время работы, а макросы — во время компиляции (поэтому тут и уместна приставка мета-). Конечно, макросы могут вызывать другие функции (в этом главное отличие от большинства других макросистем).

Простой пример: для того, чтобы включить в программу на C парсер, нужно вызвать отдельную утилиту, которая описание грамматики сконвертирует в код на C. А в Лиспе для этого нужно лишь написать соотв. макрос. Другой пример — автоматическое выведение типов а-la ML.
Friday, May 6th, 2005 05:18 pm (UTC)
> Или вы имеете в виду, что константные выражения в Лиспе вычисляются при компиляции?

Не константные. Любые. Во время компиляции доступен ВЕСЬ язык. Которым можно компилятор расширять как угодно.
Friday, May 6th, 2005 10:54 pm (UTC)
Ну почему же неизвестны? Очень даже известны. Мы можем во время компиляции производить любые операции над собственно кодом программы. Чем это код - не данные? При этом, в таких метаязыках, как Лисп и Схема, мы используем для этих преобразований тот же язык. В C++ - это свой, отдельный язык, чисто функциональный, кстати. В метаязыках с семантикой splice-ов, опять же, можно применять сам целевой язык, как пример - метапрепроцессор Jatha для языка Java, или Template Haskell.

Всё же, рекомендую статью прочитать.
Wednesday, May 11th, 2005 12:01 pm (UTC)
3. Во время компиляции работают макросы. А если входные параметры нужны в рантайме, то это нужно делать функцией.

Макросы принимают на входе данные, но генерируют код. Например, данные — грамматика, а код — парсер.

А парсер не входит в RTL Лиспа. Я не понял последний абзац. RTL вообще не причём :)

Смысл в том, что можно расширять компилятор Лиспа. Например, добавить парсер. И это ещё не самое впечатляющее.
Friday, May 6th, 2005 09:59 am (UTC)
2. Есть ещё функции :)
Friday, May 6th, 2005 10:30 am (UTC)
Как раз это - большая бяда CL, что не является - он не гарантирует корректности хвостовой рекурсии, в отличии от той же Схемы, и, соответственно, на нём не просто можно, но и неизбежно нужно писать императивно.

> А чем, собственно, макрос отличается от фукнции, кроме имени, я не совсем понял.

Может, моя статейка поможет разобраться:

http://arxiv.org/abs/cs.PL/0409016

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

Лисп позволяет мыслить в любых терминах, на любом уровне абстракции. Как и любой другой метаязык.
Friday, May 6th, 2005 12:44 pm (UTC)
> Как раз это - большая бяда CL, что не является - он не гарантирует корректности хвостовой рекурсии, в отличии от той же Схемы, и, соответственно, на нём не просто можно, но и неизбежно нужно писать императивно.

это неверно.
главной бядой CL являются сектанты вроде фанатов ¨языка¨ Scheme, которые на голубом глазу сообщают лисподевственным людям херню вроде процитированного выше отрывка.
Friday, May 6th, 2005 01:04 pm (UTC)
Херню, гойворишь? Показать реализации CL, в которых *НЕТ* корректной хвостовой рекурсии? Или сам найдёшь и извинишься?

P.S. Вообще-то я предпочитаю CL Схеме, за инкрементальную компиляцию. За неё можно простить даже раздельные пространства имён для функций и всего остального...
Friday, May 6th, 2005 01:24 pm (UTC)
> Показать реализации CL, в которых *НЕТ* корректной хвостовой рекурсии?

дяденька!  окащенять меня бесполезно, я в этом деле нетренированный.  я HyperSpec читал, покуда вы в федошной песочнице друг другу письки показывали и Y-combinator трактовали.

отсутствие хвостовой рекурсии в стандарте CL — это не ¨бяда¨, это вполне сознательный фичер.

> За неё можно простить даже раздельные пространства имён для функций и всего остального

каковые тоже есть сознательные фичеры.  которые мне очень нравятся, кстати.  если бы я всосал Y-combinator с молоком лямбда-матери и был бы академик, моё мнение могло бы быть и другим.  в чём я совершенно не сомневаюсь, впрочем, так это в том что в подобном случае я полностью отдавал бы себе отчёт об отличии академии от реального мира, и не выдавал бы свои предпочтения за истину в последней инстанции.
Friday, May 6th, 2005 01:40 pm (UTC)
> отсутствие хвостовой рекурсии в стандарте CL — это не ¨бяда¨, это вполне сознательный фичер.

Фигнанына. Это ни разу не сознательное, а только лишь вынужденное решение. И практически все *вменяемые* компиляторы CL таки хвостовые рекурсии разворачивают. Однако:

a) закладываться на это НЕЛЬЗЯ, так как "практически" - это не "все"

b) в силу этого, ФУНКЦИОНАЛЬНО писать на CL - тоже нельзя (да и на фиг не надо), всегда, когда глубина рекурсии непредсказуема, она должна заменяться на цикл.

Имеешь что либо супротив возразить - вперёд. Иначе - не хер вякать.
Friday, May 6th, 2005 01:54 pm (UTC)
> Фигнанына. Это ни разу не сознательное, а только лишь вынужденное решение.

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

по крайней мере я склонен интерпретировать публичные высказывания того же Кента Питмана на данную тему именно таким образом (и несложный поиск на Google Groups с соответствующими ключевыми словами мне свидетель).

если есть свидетельства обратного, то давай их сюда.

> практически все *вменяемые* компиляторы CL таки хвостовые рекурсии разворачивают

и правильно делают, ибо это вполне приятная и недорогая для компилятора оптимизация.  но заметь также, что ни один *вменяемый* компилятор не производит этой оптимизации когда (> debug optimize), что характерно.

> в силу этого, ФУНКЦИОНАЛЬНО писать на CL - тоже нельзя (да и на фиг не надо)

золотые слова, в скобочках-то!
Friday, May 6th, 2005 02:12 pm (UTC)
> создатели стандарта безусловно знали о хвостовой рекурсии, и не стандартизивовали её сознательно. не потому что не могли, а потому что не хотели.

Я понял так: не хотели заставлять тех, кто не может. То есть, сочли это не обязательным требованием. Откуда и вышеизложенные выводы.

> но заметь также, что ни один *вменяемый* компилятор не производит этой оптимизации когда (> debug optimize), что характерно.

Да нет, тому же OCaml по сараю, он всегда развернёт.

> золотые слова, в скобочках-то!

Так я вообще не понимаю, об что мы таки спорим. Лисп - не функциональный язык, на Лиспе и нельзя писать чисто функционально, да и не для того он нужен, чтоб чисто функционально писать. С этими утверждениями тут хоть кто-то не согласен?!?
Friday, May 6th, 2005 04:11 pm (UTC)
> Я понял так: не хотели заставлять тех, кто не может.

вполне возможно, что кто-то и не мог.
факта явно осознанного предпочтения это не отменяет.

> тому же OCaml по сараю

а кто говорит про, прости оссподи, O'Caml?

> Так я вообще не понимаю, об что мы таки спорим

а мы не то чтобы и спорим.  просто я пытаюсь пояснить тебе явную неуместность мелкого сектантского миссионерства в данном контексте.  плюс по поводу данной конкретной темы слегка наболело: откуда, по-твоему, у человека ¨знания¨ о лиспе на уровне ¨всюду списки, рекурсия и скобочки¨?  от таких вот умников, которые вместо того чтобы рассказать что-нибудь существенное, с блеском в глазах гонят телеги про хвостовую рекурсию и прочую откровенную (для девственной аудитории) эзотерику.

(no subject)

[identity profile] cmm.livejournal.com - 2005-05-06 04:51 pm (UTC) - Expand

(no subject)

[identity profile] cmm.livejournal.com - 2005-05-06 05:02 pm (UTC) - Expand

(no subject)

[identity profile] mauhuur.livejournal.com - 2005-05-06 05:12 pm (UTC) - Expand

(no subject)

[identity profile] nuclight.livejournal.com - 2005-05-06 07:36 pm (UTC) - Expand

(no subject)

[identity profile] mauhuur.livejournal.com - 2005-05-06 10:55 pm (UTC) - Expand

(no subject)

[identity profile] mauhuur.livejournal.com - 2005-05-06 11:03 pm (UTC) - Expand

(no subject)

[identity profile] mauhuur.livejournal.com - 2005-05-06 11:34 pm (UTC) - Expand

(no subject)

[identity profile] cmm.livejournal.com - 2005-05-08 08:33 am (UTC) - Expand

(no subject)

[identity profile] cmm.livejournal.com - 2005-05-08 09:20 am (UTC) - Expand

(no subject)

[identity profile] cmm.livejournal.com - 2005-05-08 10:31 am (UTC) - Expand

(no subject)

[identity profile] cmm.livejournal.com - 2005-05-08 11:11 am (UTC) - Expand

(no subject)

[identity profile] cmm.livejournal.com - 2005-05-08 11:22 am (UTC) - Expand

(no subject)

[identity profile] cmm.livejournal.com - 2005-05-08 11:42 am (UTC) - Expand

(no subject)

[identity profile] cmm.livejournal.com - 2005-05-08 12:23 pm (UTC) - Expand

(no subject)

[identity profile] cmm.livejournal.com - 2005-05-10 05:48 pm (UTC) - Expand

(no subject)

[identity profile] cmm.livejournal.com - 2005-05-10 06:29 pm (UTC) - Expand

(no subject)

[identity profile] mauhuur.livejournal.com - 2005-05-09 06:46 pm (UTC) - Expand

(no subject)

[identity profile] mauhuur.livejournal.com - 2005-05-10 10:09 am (UTC) - Expand

(no subject)

[identity profile] mauhuur.livejournal.com - 2005-05-10 11:33 am (UTC) - Expand

(no subject)

[identity profile] mauhuur.livejournal.com - 2005-05-09 06:44 pm (UTC) - Expand

(no subject)

[identity profile] cmm.livejournal.com - 2005-05-08 11:19 am (UTC) - Expand

(no subject)

[identity profile] cmm.livejournal.com - 2005-05-08 11:32 am (UTC) - Expand

(no subject)

[identity profile] mauhuur.livejournal.com - 2005-05-09 06:41 pm (UTC) - Expand

(no subject)

[identity profile] mauhuur.livejournal.com - 2005-05-10 11:26 am (UTC) - Expand

(no subject)

[identity profile] cmm.livejournal.com - 2005-05-10 05:11 pm (UTC) - Expand

(no subject)

[identity profile] mauhuur.livejournal.com - 2005-05-06 11:05 pm (UTC) - Expand
Friday, May 6th, 2005 01:06 pm (UTC)
И, киста ти, Guy Steele - сектант, или как?
Friday, May 6th, 2005 01:16 pm (UTC)
Guy Steele — гений и, то что называется, visionary.
Scheme — безусловно, весьма интересный академический эксперимент, воплотивший в жизнь многие на тот момент сырые и неопробованные идеи, за что ему большое спасибо.  пользоваться же я всё-таки предпочитаю CL.
Friday, May 6th, 2005 01:38 pm (UTC)
Я тоже предпочитаю CL.

Но ещё более предпочёл бы CL с некоторыми фичами Схемы.
Friday, May 6th, 2005 03:11 pm (UTC)
> Однако когда мне говорят, что на определённом языке можно писать в абсолютно любом стиле - то я отношусь к этому с определённым недоверием, даже не будучи экспертом по этому языку.

А что же в этом такого странного? Мне и в голову не приходило, что сей факт кого-то в принципе может удивлять.

> Но, возможно, я неправильно вас понимаю - что значит "метаязык"?

Это значит, что язык - расширяемый. Ему можно как угодно менять синтаксис и семантику. То есть, Лисп можно очень легко и непринуждённо превратить в *любой* язык. Обычно, на основе Лиспа делают маленькие языки, заточенные под преметную область, на которых соответствующие задачи решаются тривиально.

Friday, May 6th, 2005 10:55 am (UTC)
Вопрос, не является ли это такой же ересью по отношению к задумке языка, как писать императивно, например, на Прологе?

А не получится на Прологе писать императивно - её, императивности, там просто нет, как нет родной реализации, ну скажем, regexp engine на Прологе - в виде иллюстрации факта неимперативности. Bindings к Сишным реализациям - есть, своей - нет. Пролог вообще специфичный язык, предназначенный решать эффективно одну-единственную задачу - перебор множества решений.
Tuesday, May 10th, 2005 11:53 am (UTC)
Вообще говоря, единственным предназначением Пролога было морочить голову щедрым, но не очень сообразительным кураторам проекта "5-е поколение компьютеров".
Tuesday, May 10th, 2005 05:15 pm (UTC)
не надо утрировать.
основным занятиям академиков вообще является морочить голову щедрым и не очень сообразительным грантодавателям, однако не все академические результаты бесполезны.
на универсальный языл программирования Пролог, мягко скажем, не тянет.  но польза от него есть.