LINUX.ORG.RU

Вышел Racket 6.3

 , ,


2

9

Доступен для скачивания релиз 6.3 языка программирования Racket — http://racket-lang.org/.

Новшества:

  • При раскрытии макросов используется новое представление связывания, что позволяет проще понимать как макросы сохраняют связывания, особенно при вовлечении в процесс раскрытия нескольких модулей и при отклонении от гигиены при раскрытии.
  • GUI-библиотека Racket теперь использует Gtk3+ по умолчанию.
  • Новое руководство по Redex.
  • Улучшена проверка синтаксических ошибок для Redex-паттернов.
  • Bluebox стали более агрессивными в плане отыскания имён для поиска в документации.
  • Подмодули теперь полностью поддерживаются в Typed Racket.
  • Библиотека typed/racket/unsafe предоставляет формы импорта/экспорта для обхода генерации контрактов.
  • Typed Racket предоставляет экспериментальную поддержку units (из racket/unit).
  • Экспериментальная форма define-new-subtype позволяет указывать тонкие различия, без которых типы считаются идентичными (аналог new type в Haskell).
  • Конструктор типов Promise изменился, нарушив обратную совместимость для устранения promise, созданных с помощью promise/name.
  • Пакеты unstable-* исключены из главного дистрибутива.
  • big-bang поддерживает режим display-mode, что позволяет т.н. «мировым» программам (интерактивным, графическим программам, состоящих из простых математических функций) занимать весь экран целиком.

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

anonymous

Проверено: maxcom ()
Последнее исправление: maxcom (всего исправлений: 2)
Ответ на: комментарий от monk

А всетаки, в чем разница между conditions комона и continuations ракета в плане практического использования? Если мне, например, надо в функции прочитать значение из файла и, если чтение не удалось, вернуть управление выше по стеку вызовов и там решить, как продолжать выполнение функции: либо заюзать дефолтное значение, либо считать из другого файла, либо плюнуть на выполнение задачи, либо переспросить у своего «хозяина» итп. Кажется так выглядит типичный юзкейс кондишенов. Так вот, с помощью продолжений, такое наверно записываеться выкидыванием исключения со значением продолжения или как? И как в таком случае работает управление ресурсами?

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

А всетаки, в чем разница между conditions комона и continuations ракета в плане практического использования?

В том, что использование продолжений не ограничен обработкой ошибок.

Так вот, с помощью продолжений, такое наверно записываеться выкидыванием исключения со значением продолжения или как?

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

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

в чем разница между conditions комона и continuations ракета в плане практического использования?

Можно писать web server в стиле:

(define (make-main-page)
  (define-values (user password) (make-auth-page))
  (if (user-ok? user password)
      (template-main-page)
      (error page "Incorrect password")))

где make-auth-page рисует страницу с запросом имени и пароля и возвращает имя и пароль (эдакий диалог, но на http/html)

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

где make-auth-page рисует страницу с запросом имени и пароля и возвращает имя и пароль (эдакий диалог, но на http/html)

В теории красиво. Но возникает вопрос: насколько хватит такого web-сервера, если, например, злоумышленник откроет сотни тысяч диалогов, которые будут ждать ввода имени/пароля?

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

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

Ну будут висеть (до таймаута) сотня тысяч ссылок на продолжения (указатель + стек). Займут пару мегабайт и сотню тысяч тактов на проход GC.

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

Примерно так (это полный работающий код):

#lang web-server/insta
; start: request -> response
(define (start request)
  (show-counter 0 request))
 
; show-counter: number request -> doesn't return
; Displays a number that's hyperlinked: when the link is pressed,
; returns a new page with the incremented number.
(define (show-counter n request)
  (define (response-generator embed/url)
    (response/xexpr
     `(html (head (title "Counting example"))
            (body
             (a ((href ,(embed/url next-number-handler)))
                ,(number->string n))))))
 
  (define (next-number-handler request)
    (show-counter (+ n 1) request))
  (send/suspend/dispatch response-generator))

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

Ну будут висеть (до таймаута) сотня тысяч ссылок на продолжения (указатель + стек). Займут пару мегабайт и сотню тысяч тактов на проход GC.

Ок. А если хочется ограничить число одновременно открытых диалогов/страниц (т.е. число сессий), то как это сделать с продолжениями?

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

ограничить количество продолжений, очевидно

Не совсем очевидно как это будет выглядеть в реальности. (Просто далеко не все знакомы с этой темой.) Насколько усложнится реальный код?

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

А можешь какой-нибудь url dispatcher посоветовать

Именно по url есть такой: http://docs.racket-lang.org/web-server/dispatch.html . Только он с продолжениями плохо дружит (в смысле, транслировать url<->продолжение приходится вручную).

Или стандартный вариант:

(define (make-servlet path start)
  (define servlet (make-v2.servlet (current-directory)
                                   (make-threshold-LRU-manager #f (* 1024 1024 64))
                                   start))
  (λ (url)
    (match (url-path url)
      [(list (path/param (? (and/c path)) _) _ ...) servlet]
      [else (next-dispatcher)])))

(serve
 #:dispatch (seq:make
             (servlet:make (make-servlet "news" news))
             (servlet:make (make-servlet "jobs" jobs))
             (servlet:make (make-servlet "helpdesk" helpdesk-handler))
             (files:make #:url->path (make-url->path "/var/www/")))
 #:listen-ip #f
 #:port port)

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

Ни на сколько, это вопрос настроек сервера, фактически.

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