LINUX.ORG.RU

5-й номер журнала «Практика функционального программирования»

 , , , , , ,


0

0

Вышел новый, пятый номер журнала «Практика функционального программирования». В новом номере опубликованы следующие статьи:

  • Инструменты интроспекции в Erlang/OTP. Максим Трескин
  • Экономия ошибок. С. Зефиров, А. Сафронов, В. Шабанов, Е. Мельников
  • Введение в F#. Евгений Лазин, Максим Моисеев, Давид Сорокин
  • Лисп — философия разработки. Всеволод Дёмкин, Александр Манзюк
  • Оптимизирующие парсер-комбинаторы. Дмитрий Попов
  • Модель типизации Хиндли — Милнера и пример её реализации на языке Haskell. Роман Душкин

Также в этом номере опубликованы результаты конкурса, который был объявлен в 3-м номере журнала.

>>> Подробности

★★★★★

Проверено: maxcom ()
Ответ на: комментарий от www_linux_org_ru

> т.е. сливает

ну да, сливает. А чо?

a все потому, что не хватает абстракций, которые в с++ имеются


цепепе тоже сливает, если все его фишки использовать. И вообще в основном все аппликухи тормозят на IO, так чта пофиг.

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

вот love5an пытался портировать мой код, измеряющий скорость эксепшенов, в лисп, и попал на 2-4 кратное отставание из-за того, что часть битов в инт-е отдается под тип, и это ему побороть не удалось


он не предлагал на 64 битах потестить?

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

> цепепе тоже сливает, если все его фишки использовать.

например?

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

> это п%ц :) ну и я имел ввиду реализацию не под каждый отдельный «лисп» - это таки не так связано с проектированием, как с жеванием кактуса :)

какая разница? подход тот же.

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

У цлисперов богатая фантазия. Причем тут С++ то? Ответ про erlang был.

ЗЫ. Что не тема об ФП, так прибегают цлисперы и что-то пытаются доказать. Вопрос такой: почему хацкелисты/эрлангисты/и тп не троллят как цлисперы?)

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

> какая разница? подход тот же.

не совсем - тут это больше напоминает С с описанием прототипов функций и реализацией через #ifdef, чем интерфейсы

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

>> его мнение влияет на что-то, твое - нет

Тебе так кажется.

совершенно бессмысленно обсуждать «кто главнее или авторитетнее»;

с другой стороны, линус по-моему прав, а если ты не согласен, приведи контрпримеры — если они верные, люди их примут независимо от твоего авторитета

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

> он не предлагал на 64 битах потестить?

предлагал, но никто так и не потестил; но суть не в этом — я хочу указать компилятору лиспа, что (емнип) глобальная переменная имет тип int и нехрен туда пихать свои дурацкие биты с типизацией — но не могу

это и называется отсутсвие абстракций

впрочем, может он лень ему было убедить компилятор в этом — но это тоже показатель

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

> И вообще в основном все аппликухи тормозят на IO, так чта пофиг.

сомневаюсь; впрочем, тема «затрат времени на переключение контекста» интересная, и возможно стоит завести под одну идею спец-флейм

вкратце, емнип, чувак сделал разделение сегментов, и ОС доступна при загрузке в сегментный регистр (это х86-only) чего-то-там; все загрузки в сегментные регистры проверяются (и запрещаются) статически

кто напомнит название?

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

интерфейс:

(defclass abstract-channel () ())

(defgeneric channelp (channel)
  (:method ((anything-else t)) nil)
  (:method ((channel abstract-channel)) t))

(defgeneric send (chan value &key)
  (:method ((channels sequence) value &key (blockp t))
    (loop do (mapc (fun (when (send _ value :blockp nil) (return _)))
                   channels)
       unless blockp return nil))
  (:documentation "Tries to send VALUE into CHAN. If a sequence of channels is provided
instead of a single channel, SEND will send the value into the first channel that doesn't block. If
BLOCKP is true, SEND will continue to block until it's able to actually send a value. If BLOCKP is
NIL, SEND will immediately return NIL instead of blocking, if there's no channel available to send
input into. When SEND succeeds, it returns the channel the value was sent into."))

(defgeneric recv (chan &key)
  (:method ((channels sequence) &key (blockp t))
    (loop do (map nil (fun (multiple-value-bind (return-val succeeded) (recv _ :blockp nil)
                             (when succeeded (return (values return-val _)))))
                  channels)
       unless blockp
       return (values nil nil)))
  (:documentation "Tries to receive from either a single channel, or a sequence of channels. If
BLOCKP is true, RECV will block until it's possible to receive something. Returns two values: The
first is the actual value received through the channel. The second is the channel the value was
received from. When BLOCKP is NIL, RECV will immediately return (values NIL NIL) instead of
blocking (if it would block)"))

реализация, например для «Unbuffered channels»:

(defclass channel (abstract-channel)
  ((value :initform *secret-unbound-value* :accessor channel-value)
   (readers :initform 0 :accessor channel-readers)
   (writers :initform 0 :accessor channel-writers)
   (lock :initform (bt:make-recursive-lock) :accessor channel-lock)
   (send-ok :initform (bt:make-condition-variable) :accessor channel-send-ok)
   (recv-ok :initform (bt:make-condition-variable) :accessor channel-recv-ok)
   (send-return-wait :initform (bt:make-condition-variable)
                     :accessor channel-send-return-wait)
   (recv-grabbed-value-p :initform nil :accessor recv-grabbed-value-p)))

(defmethod send ((channel channel) value &key (blockp t))
  (with-accessors ((lock channel-lock)
                   (recv-ok channel-recv-ok))
      channel
    (bt:with-recursive-lock-held (lock)
      (with-write-state channel
        (loop while (send-blocks-p channel)
           if (or blockp (channel-being-read-p channel))
           do (bt:condition-wait (channel-send-ok channel) lock)
           else do (return-from send nil)))
      (bt:condition-notify recv-ok)
      (let ((block-status (channel-being-read-p channel)))
        (channel-insert-value channel value)
        (when block-status
          (loop until (recv-grabbed-value-p channel)
             do (bt:condition-wait (channel-send-return-wait channel) lock)
             finally (setf (recv-grabbed-value-p channel) nil))))
      channel)))

(defmethod recv ((channel channel) &key (blockp t))
  (with-accessors ((lock channel-lock)
                   (send-ok channel-send-ok))
      channel
    (bt:with-recursive-lock-held (lock)
      (with-read-state channel
        (bt:condition-notify send-ok)
        (loop while (recv-blocks-p channel)
           do (if (or blockp (channel-being-written-p channel))
                  (bt:condition-wait (channel-recv-ok channel) lock)
                  (return-from recv (values nil nil))))
        (multiple-value-prog1
            (values (channel-grab-value channel) channel)
          (setf (recv-grabbed-value-p channel) t)
          (bt:condition-notify (channel-send-return-wait channel)))))))
CL-USER
()
Ответ на: комментарий от arhibot

> Да и вообще журнал 'практика фп', а обсуждают какой-то цлисп.

Ещё совсем недавно (скажем, неделю назад) на главной странице fprog.ru было написано «Практика функционального программирования и программирования на языке Common Lisp». Если бы редакция журнала не помещала в него статьи про Common Lisp, то наверное и разговора не было. Но так сложилось, что статьи на тему «алгебраических типов данных» и т.п. особого интереса у народа не вызывают, а тема лиспа она вечная.

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

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

Доо. Ты за себя говори - я, например, читал статьи по основам ФП, но не читал ровно ничего о Лиспе - не интересно и не нужно.

а тема лиспа она вечная.

Пофлеймить мы любим.

tailgunner ★★★★★
()

C++0x это мутант какой-то.
Питон неплох тем, что позаимствовал кое-что из перла.
И несмотря на все, питон довольно шуст, тут спорить не с чем.

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

так defgeneric по-твоему интерфейс, а defmethod — реализация?

А что это по твоему? defgeneric объявляет интерфейс к функции, а defmethod - одну из её специализаций. Что это, если не интерфейс?

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

> может, тогда и int a[3]; это интерфейс, а a[2]=42 это реализация?

а что, что-то не по шаблону цепепе, жабы и других алголоподобных? дык не все заканчивается на них.

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

> так defgeneric по-твоему интерфейс, а defmethod — реализация?

Конечно. При этом, интерфейс не привязан к классу или чему-либо подобному. defgeneric объявляет обобщенную функцию, которую с помощью defmethod специализируют для выбранного типа (или даже объекта). Поэтому, например, такое понятие как «абстрактные классы» в CL отсутствует, и с позиций CL выглядит как костыль.

может, тогда и int a[3]; это интерфейс, а a[2]=42 это реализация?


Нет, ты все неправильно понял.

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

>> но не читал ровно ничего о Лиспе - не интересно и не нужно.

не читали,

Гораздо хуже, если видишь в прочитанном то, что хочешь, а не то, что есть. Я прочитал достаточно книг по Лиспу, чтобы решить, что _мне_ он не нужен, и в fprog статьи о Лиспе пропускаю.

но осуждаем...

Где я его осуждаю?

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

с другой стороны, линус по-моему прав, а если ты не согласен, приведи контрпримеры — если они верные, люди их примут независимо от твоего авторитета

Это какую такую простую задачу решает ядро в своих 442 мб кода? 3 аллокатора, 3 профилировщика, 2 ветки ata. Да почти всех подсистем по несколько копий :) Некоторые бажные by design, а выкинуть не выкидываю, ибо «юзерспейс уже к багам привык, сломается». Ядро линукса - это ещё более жёсткая свалка, чем Емакс или Коммон Лисп.

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

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

> Где я его осуждаю?

игнорированием и принижением его достоинств... :)

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

> так же ты и про гит ничего не читал... ;-)

Если это мне, то первый год существования Git я полностью читал его девелоперский лист, и даже пытался перевести свои проекты на него :) Потом забил - Mercurial меня полностью устраивал.

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

> defgeneric объявляет обобщенную функцию

наподобие шаблонов в С++? если да - можно не рассказывать про разницу между ними, она очевидна

Поэтому, например, такое понятие как «абстрактные классы» в CL отсутствует, и с позиций CL выглядит как костыль.


«отсутствует» значит «выглядит как костыль» - так все говорят :)

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

>питон довольно шуст

какой разговор тут может быть вообще о скорости, если питон без костылей - это только однопоточный интерпретатор (и это 21 век!)? и в питоне фактически есть только обрывки из CL, но с другим синтаксисом. питон - как бы CL--. какой в смысл в его использовании находят - совершенно не ясно.

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

«отсутствует» значит «выглядит как костыль» - так все говорят :)

Страуструпп вот очень мультиметоды хотел...

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

> А Емакс, кстати, - это давно дистрибутив елисповых программ, а не только текстовый редактор

Линус так и написал, если что

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

> «отсутствует» значит «выглядит как костыль» - так все говорят :)

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

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

> а кто тут у нас такой ярый поклонник еще?

«Ярый поклонник» попробовал и сравнил все имевшиеся на тот момент DVCS, включая совсем уж малоизвестные :-P

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

> А что это по твоему? defgeneric объявляет интерфейс к функции, а defmethod - одну из её специализаций. Что это, если не интерфейс?

ну дык,

int a[3]; это интерфейс, а[2]=42 это одна из специализаций

typedef int func(...); func dispatch_table[10000] это интерфейс, dipatch_table[1234]=other_function это одна из специализаций

typedef int func(...); map<string, func> dispatch_table; это интерфейс, dipatch_table[«my_class»]=other_function это одна из специализаций

defgeneric это интерфейс, defmethod это одна из специализаций

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

> наподобие шаблонов в С++?

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

«отсутствует» значит «выглядит как костыль» - так все говорят :)


Абстрактные классы в C++ это точно костыль.

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

> нет, это значит, что этот недоязыковый атавизм попросту не нужен

этот «ненужный недоязыковый атавизм» используется чаще чем весь лисп :)

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

> «Ярый поклонник» попробовал и сравнил все имевшиеся на тот момент DVCS, включая совсем уж малоизвестные :-P

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

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

> абстрактные классы в C++ это точно костыль.

я уже писал про то как реагируют лисперы на все, что не вписывается в лисп

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

разве кто-то тут называл их костылями?

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

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

А Емакс, кстати, - это давно дистрибутив елисповых программ, а не только текстовый редактор

Линус так и написал, если что

На своё ядро пусть посмотрит :)

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

>> абстрактные классы в C++ это точно костыль.

я уже писал про то как реагируют лисперы на все,

что не вписывается в лисп



Я как бы писал на C++ очень плотно около 7-ми лет и да, мне потребовалось познакомиться с CLOS, что бы понять, что «абстрактные классы» это костыль.

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

этот «ненужный недоязыковый атавизм» используется чаще чем весь лисп :)

Говорят, в Монреале 30% населения - п-ры. Это разве говорит о том, что п-ры лучше мужиков?

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

>> «Ярый поклонник» попробовал и сравнил все имевшиеся на тот момент DVCS, включая совсем уж малоизвестные :-P

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

Времена поменялись, а git остался говном (ага, мне немного приходится его использовать - ядро, U-Boot, qemu).

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

>> int a[3]; это интерфейс, а[2]=42 это одна из специализаций

Бросай курить эту гадость

ну так раскажи, в чем принципиальная разница

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