LINUX.ORG.RU

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

для функционального стиля глубоко пофигу, по ссылке оно, или по значению

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

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

отсутствие которых ФП _принципиально гарантирует_

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

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

видно, что structure-class не является standard-class.

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

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

Успешно сделанный и проданный лисп-проект только один - QPX от ITA Software. И успех его - не благодаря лиспу, а вопреки.

Не соглашусь. Я специально изучал этот вопрос. Из самых заметных, могу привести следующие примеры:

  • Кинофильм «Титаник». Софт, управляющий фермами рендеринга и сводящих все результаты.
  • Нейронная сеть обработки сигналов с радаров в реальном времени, позволяющая отличить ложные ядерные боеголовки.
  • Проект NASA по генерации ассемблера для управляющих микроконтроллеров. Сейчас это используется для беспилотников.
  • Кинофильм «Властелин Колец». Образ Горлума был создан софтом на Lisp.
Alex-Alex
() автор топика
Ответ на: комментарий от mv

Программирование - это банально и скучно, не то, что двигатель там какой вскрыть.

Промышляешь продажей краденных запчастей?

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

Не хватает пруфов. Кроме того, только второй пункт можно признать хоть на что-то годным. Остальное можно писать на чем угодно и никакие преимущества/недостатки лиспа не повлияют.

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

Haskell неоправданно переусложнен. К тому же там нет объекто-ориентированной парадигмы, и как следствие невозможность отделение интерфейса от реализации.

Ребята, это тролль

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

Про анимацию Горлума вроде читал на fprog.ru. Но сайтик у них убог и скорбен, как сиротки церковном приюте, даже поиск прикрутить не сподобились.

Alex-Alex
() автор топика
Ответ на: комментарий от korvin_

каждому типу соответствует класс, а значит можно получить слоты

А на http://www.alu.org/mop/dictionary.html написано, что список слотов для класса, не являющегося standard-class должен быть пустым (а для forward-referenced-class обязан возвращать ошибку).

Причем в определении class-slots: This method returns the value associated with the class metaobject by finalize-inheritance (standard-class) or finalize-inheritance (funcallable-standard-class).

Можешь попробовать сделать finalize-inheritance на структуру... хотя хз, может в SBCL и это переопределили.

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

По ссылке я могу модифицировать объект

ФП — это значит, что твоя процедура не модифицирует объект. А если модифицирует, значит это не ФП.

«побочный эффект», отсутствие которых ФП принципиально гарантирует.

??? даже Haskell позволяет писать в файлы (что, определённо, является побочным эффектом).

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

Я тебе скажу в чем у меня была проблема с хацкелем. Он выдает сообщение об ошибке в том месте, где он ее встретил. Хотя на самом деле ошибка локализована за 1350 строк в другом месте. Я потратил 4 дня на эту хрень, пока местный гуру по хацкелю не объяснил мне эту особенность компилятора. Ну и нахрен такой язык нужен, когда у тебя 4 миллиона строк в проекте? Той же хренью страдает boost. Сообщение об ошибке - 8 экранов.

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

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

тут должна быть ссылка на код, т.к. твои слова полны 4.2 и непонимания, но можно догадаться о какой реальной ситуации ты можешь говорить.

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

ФП, как я его понимаю, это значит, что функция, при совпадающем множестве значений параметров, вернет один и тот же результат, не зависящий от контекста исполнения.

Строго говоря, функция детерминирована и не влияет на enviroment (нет побочных эффектов). Хаскель в файлы и на консоль пишет весьма извращенным образом, посредством морганатического выкидыша (монады), созданного бесовской силой, соединившей прелесть и чистоту непорочной девы Лямбды и вонючего верблюда Боба (весь остальной мир).

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

вернет один и тот же результат, не зависящий от контекста исполнения.

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

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

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

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

ФП, как я его понимаю, это значит, что функция, при совпадающем множестве значений параметров, вернет один и тот же результат, не зависящий от контекста исполнения.

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

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

LOL. Попробуй написать чего-нибудь сложного.

А можно пример неосмысленной диагностики? Потому как пока удобней всего SBCL. Есть полный стектрейс, текущие значения переменных, возможность выполнить любую команду в этом месте.

Лучше видел только у 1С.

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

ФП, как я его понимаю, это значит, что функция, при совпадающем множестве значений параметров, вернет один и тот же результат, не зависящий от контекста исполнения.

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

dmfd
()
Ответ на: комментарий от Alex-Alex

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

qulinxao ★★☆
()
Ответ на: комментарий от Alex-Alex

Я тебе скажу в чем у меня была проблема с хацкелем. Он выдает сообщение об ошибке в том месте, где он ее встретил. Хотя на самом деле ошибка локализована за 1350 строк в другом месте. Я потратил 4 дня на эту хрень, пока местный гуру по хацкелю не объяснил мне эту особенность компилятора. Ну и нахрен такой язык нужен, когда у тебя 4 миллиона строк в проекте? Той же хренью страдает boost. Сообщение об ошибке - 8 экранов.

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

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

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

А никак. Та же самая монада - жалкая попытка решать реальные задачи средствами чистых функциональных языков. Это как принцип детерминизма в классической механике, «дайте мне начальные импульсы и координаты всех частиц, и я опишу будущее МИРА». Ага, хрен ты там чего опишешь, понты дешевые только, как и с хаскелем.

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

Будешь отлавливать в рантайме

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

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

А никак. Та же самая монада - жалкая попытка решать реальные задачи средствами чистых функциональных языков. Это как принцип детерминизма в классической механике, «дайте мне начальные импульсы и координаты всех частиц, и я опишу будущее МИРА». Ага, хрен ты там чего опишешь, понты дешевые только, как и с хаскелем.

Тем не менее, концепция монад оказалась очень полезной при реализации практичного F# async workflow. Писать ввод-вывод через async в silverlight было сплошным удовольствием, тогда как шарписты очень мучались.

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

при реализации практичного F# async workflow

Тогда уж сразу continuation/CPS вспоминать надо, который был раньше монад и решал ту же задачу не хуже (а в варианте поддержки continuation в рантайме даже лучше).

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

В С++ сто лет назад появился ActiveObject. И монады там совсем не нужны.

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

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

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

Объективно, надо сравнивать с python, ruby, scala...

В целом скорость разработки примерно одинаковая.

Ну вот и я о чем :) Lisp выруливает на достаточно специфических задачах или огромных масштабах проекта, по сравнению с другими высокоуровневыми языками. Хотя, языки, ориентированные на конкретную платформу (java, net) все равно останутся в преимущества, если весовая доля обратной совместимости, батареек, возможности прототип на той же clojure отдать на доработку в аутсорсовую софтовую компанию индусов итд. Т.е. языки с платформой потенциально лучше подходят для т.н. интерпрайза. А разработка на CL с вероятностью 99% на нем же и останется на весь свой жизненный цикл, если его не решат «отдать на аутсорс в...». Это и хорошо, и плохо.

alienclaster ★★★
()

Только было собирался высказаться на тему, а парня-то того! Что тут у вас вообще творится?

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

По ссылке я могу модифицировать объект

Это как? В функциональном стиле, откуда вы возьмёте модификации?

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

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

Какие ваши доказательства?

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

Ты попробуй в C++ отладить такие вещи, когда надо долго думать, что надо сделать, чтобы воспроизвести эту ошибку.

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

Да ну? У тебя для функции f(x) := 1 / x статическая типизация сделает тип «всё, кроме нуля»?. И при работе с FFI сможет статически дать гарантию, что внешняя функция не испортит память?

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

Да ну? У тебя для функции f(x) := 1 / x статическая типизация сделает тип «всё, кроме нуля»?

В агде, например, запросто, насколько я пониманию.

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

Для float x эта функция просто вернёт +inf или -inf.

Подход а-ля JS, конечно, имеет право на жизнь. Но это ещё хуже. Если при вызове исключения есть контекст, в котором произошло деление на 0, то при таком подходе ошибка будет заметна только когда половина зависимых переменных получат в качестве значений Inf и NaN.

Ещё нормальная система проверок позволяет ограничивать область значений. Например для вероятности осмысленными являются значения только в промежутке 0..1. Но может быть получено невозможное значение при некорректных экспериментальных данных (количество событий различных видов). И как мне может помочь статическа типизация?

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

Так и поможет. Тебе нужны такие типы. В одних языках это будет просто(Agda), в других - сложнее и многоруками(С++, например).

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

Гм... И как будет работать код:

type Probability = Double[0..1];

Probablilty F()
{
  x := readInt();
  total := readInt();
  return x/total;
}

?

Скомпилируется? Если нет, то как он должен выглядеть для компиляции. Если да, то что произойдёт при x = 10 и total = 1?

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

Зависит от. Компилятор должен потребовать проверку от тебя(примерно как kotlin для null). Тут нужны или зависимые типы(agda, но я не возьмусь это выразить на ней) или проверяемые во время компиляции контракты(пока видел только в виде тулзовен для шарпа и явы).

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

А, еще для haskell есть реализация проверяемых во время компиляции контрактов, даже pdf'ка у меня валялась с описанием, но сейчас не найду.

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

Компилятор должен потребовать проверку от тебя(примерно как kotlin для null)

И опять же. Пусть он заставляет написать ветку if(total>x) ... Но что в этой ветке делать? Никакого разумного значения вероятности дать нельзя. Надо бросать исключение или использовать какой-то другой механизм, позволяющий или запустить отладчик или сообщить пользователю, что «при чтении файла ... в строке ... встретились неверные данные: ...».

Вот пример из Хаскеля:

import System.IO

main = do
    z <- readLn
    print (z+1)

запускаю.

monk@veles:~/languages/haskell$ ./Err 
fail
Err: user error (Prelude.readIO: no parse)

ну и какая мне польза от статической типизации, если ошибка ввода рушит программу и компилятор никак не предупреждает, что эта ситуация необработана (в Java хоть throw заставляют описать)?

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

Они его отдельно продают? o_O

В версии Professional его нет.

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

Ещё нормальная система проверок позволяет ограничивать область значений. Например для вероятности осмысленными являются значения только в промежутке 0..1. Но может быть получено невозможное значение при некорректных экспериментальных данных (количество событий различных видов). И как мне может помочь статическа типизация?

Диапазон можно было задавать еще в Ada-83. Хотя, конечно, статическая типизация весьма ограничена. Ничего, приспосабливаются люди :)

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

Некоторым на лиспе просто интереснее программировать. Этот фактор тоже надо учитывать. Программирование - далеко не рационально, как и очень многое из того, чем занимается человек. Человек, вообще, существо очень иррациональное по своей природе, даже флегматики ;)

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

Диапазон можно было задавать еще в Ada-83.

Но при этом просто возникала ошибка времени выполнения на входе в функцию. А по-другому сделать нельзя, иначе рушиться вся арифметика. x : 0..100, y: 1..100, c = x/y : 0..1.0 должно скопилироваться?

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