LINUX.ORG.RU

Вышел язык программирования Racket 7.0

 , ,


3

3

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

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

Ядро версии 7.0 является результатом переработки ядра версии 6.12 более чем на 1/8, и включает новый механизм раскрытия макросов, который осуществляет бутстрэппинг самого себя. Данный механизм покрывает более 40% кода, необходимого для замены ядра Racket на Chez Scheme. Остальные 60% кода, по бОльшей части, также реализованы, но не включены в этот выпуск; мы надеемся и предполагаем, что Racket-на-Chez будет готов для промышленного использования в следующих выпусках ветки 7.x

  • Синтаксис формы (`#'`) поддерживает новые шаблоны подформ: ~@ - для сплайсинга, и ~? - для выбора между подшаблонами, основанного на возможном «отсутствии» значения у переменных образца (например, у образца ~optional в syntax-parse). Библиотека syntax/parse/experimental/template, откуда происходят эти возможности, экспортирует новые формы под старыми именами для совместимости.
  • На Windows флаг --embed-dlls команды raco exe создаёт по-настоящему автономный исполняемый файл ".exe", который содержит в себе разделяемые библиотеки Racket.
  • Опция «Create Executable» интегрированной среды разработки DrRacket для учебных языков (Beginner Student, и т.п.) использует флаг --embed-dlls на Windows.
  • Поддержка prefab («previously fabricated») структур в Typed Racket существенно улучшена, что делает их более полиморфными, исправляя, вместе с тем, существенные ошибки текущей реализации. Программы, которые сейчас используют предикаты для prefab-структур неизвестных данных, могут нуждаться в ревизии, т.к. предыдущие версии Typed Racket позволяли программам с потенциальными ошибками осуществлять проверку типов. Смотрите Typed Racket RFC 1 и prefab-changes для более подробной информации об этом изменении, и о том, как исправить программы, которые подверглись влиянию в связи с этим изменением.
  • Typed Racket поддерживает #:rest-star в конструкторе типов ->*, что позволяет функциональным типам указывать в хвостовом списке аргументов (rest arguments) более сложные образцы типов, такие как функция hash.
  • Интерактивные оверлеи могут быть наложены на графики, созданные с помощью plot-snip. Это позволяет создавать интерактивные графики или отображать дополнительную информацию, когда указатель мыши находится над областью графика. Примеры использования данной возможности можно посмотреть тут.
  • racket/plot предоставляет процедуры для отображения графиков японских свечей (candlestick charts), которые могут быть использованы в финансовом анализе временных рядов.
  • Добавлен contract-equivalent?, который проверяет, что два контракта являются взаимосильными, без экспоненциального замедления, которое имеет место в случае двух вызовов contract-stronger?.
  • Lazy Racket поддерживает функции с именованными аргументами.

>>> Оригинал

Racket версии 7.0 включает существенные изменения в рамках долгосрочных целей замены текущей системы времени выполнения и поддержки множества систем времени выполнения.

Им и так не особо пользуются, а они еще больше хотят фрагментировать коммьюнити? Одни будут пилить одно, другие своё и т.д.?

Virtuos86 ★★★★★ ()

Вышел язык программирования Racket 7.0

Чем он лучше GNU Guile? (возможно кроме того что не-GNU)

Racket - это <...> первая в мире экосистема для языко-ориентированного программирования.

Подробнее пожалуйста.

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

а они еще больше хотят фрагментировать коммьюнити? Одни будут пилить одно, другие своё и т.д.?

Они не фрагментируют. Они переходят. А поддержка множества систем времени выполнения такая же, как поддержка множества ядер ОС в Debian. Она же не приводит к фрагментированию несмотря на существование Debian Hurd и Debian kFreeBSD.

Просто проекты типа pycket будет делать проще и они будут функциональней.

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

языко-ориентированного программирования.

Подробнее пожалуйста.

Можно писать на разных языках

#lang datalog
edge(a, b). edge(b, c). edge(c, d). edge(d, a).
path(X, Y) :- edge(X, Y).
path(X, Y) :- edge(X, Z), path(Z, Y).
path(X, Y)?

типизированный модуль mod1.rkt:

#lang typed/racket
(provide sum-list)

(: sum-list (-> (Listof Number) Number))
(define (sum-list l)
  (cond [(null? l) 0]
        [else (+ (car l) (sum-list (cdr l)))]))

можно вызвать из нетипизированного

#lang racket
(require "mod1.rkt")

(define sum-1-n (n)
  (sum-list (range (add1 n))))

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

Как у него дело с вебней? Есть развитые фреймворк?

Ага. https://docs.racket-lang.org/continue/index.html и https://docs.racket-lang.org/web-server/index.html

Можно писать так:

#lang web-server/insta
 
; A blog is a (blog posts)
; where posts is a (listof post)
(struct blog (posts) #:mutable)
 
; and post is a (post title body)
; where title is a string, and body is a string
(struct post (title body))
 
; BLOG: blog
; The initial BLOG.
(define BLOG
  (blog
   (list (post "Second Post" "This is another post")
         (post "First Post" "This is my first post"))))
 
; blog-insert-post!: blog post -> void
; Consumes a blog and a post, adds the post at the top of the blog.
(define (blog-insert-post! a-blog a-post)
  (set-blog-posts! a-blog
                   (cons a-post (blog-posts a-blog))))
 
; start: request -> doesn't return
; Consumes a request and produces a page that displays
; all of the web content.
(define (start request)
  (render-blog-page request))
 
; parse-post: bindings -> post
; Extracts a post out of the bindings.
(define (parse-post bindings)
  (post (extract-binding/single 'title bindings)
        (extract-binding/single 'body bindings)))
 
; render-blog-page: request -> doesn't return
; Produces an HTML page of the content of the BLOG.
(define (render-blog-page request)
  (define (response-generator embed/url)
    (response/xexpr
     `(html (head (title "My Blog"))
            (body
             (h1 "My Blog")
             ,(render-posts)
             (form ((action
                     ,(embed/url insert-post-handler)))
                   (input ((name "title")))
                   (input ((name "body")))
                   (input ((type "submit"))))))))
 
  (define (insert-post-handler request)
    (blog-insert-post!
     BLOG (parse-post (request-bindings request)))
    (render-blog-page request))
 
  (send/suspend/dispatch response-generator))
 
; render-post: post -> xexpr
; Consumes a post, produces an xexpr fragment of the post.
(define (render-post a-post)
  `(div ((class "post"))
        ,(post-title a-post)
        (p ,(post-body a-post))))
 
; render-posts: -> xexpr
; Consumes a blog, produces an xexpr fragment
; of all its posts.
(define (render-posts)
  `(div ((class "posts"))
        ,@(map render-post (blog-posts BLOG))))

Во всех функциях один контекст. Не надо беспокоиться ни о сессиях, ни о сериализации. send/suspend/dispatch автомагически обо всём заботится.

Если кому-то слишком неприятно видеть html в виде скобочных выражений, есть https://docs.racket-lang.org/web-server/templates.html

monk ★★★★★ ()

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

Meta Programming System же на годы старше чем Racket.

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

Но лисп не нужен,

Ну чисто для рисования или очистки какой-нибудь ненужной картинки в формате SVG, пожалуй, Лисп не нужен :-) Ну или если по жизни пользоваться парой-тройков трюков на каком-нибудь цепепе, тогда тоже не нужен :-)

а значит и срача не будет.

Просто для дискуссии тут нужны знания, которых у многих нет :-) А когда нет знаний, тогда ничего и не нужно :-)

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

И в 95м году он уже был экосистемой для языко-ориентированного программирования, а не просто очередной схемой со своими батарейками?

Rebol, кстати, появился в 97, так что сомневаюсь, что ракетка была первой.

anonymous ()

Racket-на-Chez будет готов для промышленного использования в следующих выпусках ветки 7.x

И тогда он наконец перестанет быть лютым тормозом и сможет потягаться с ccl или даже с sbcl?

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

И тогда он наконец перестанет быть лютым тормозом и сможет потягаться с ccl или даже с sbcl?

Возможно :-) А уже сегодня он далеко впереди CCL или даже SBCL по: качеству документации, встраиваемости в другие программы, по активности сообщества, по динамике развития, по наличию чётких целей дальнейшей разработки. Насколько мне известно, ничем таким ни CCL, ни SBCL похвастаться не могут.

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

И в 95м году он уже был экосистемой для языко-ориентированного программирования, а не просто очередной схемой со своими батарейками?

Я же написал: #lang появился в нём в 2008. И тогда же первый непохожий на Scheme синтаксис:

#lang profj/full
 
class Example {
  static String result = null;
  public static void Main(String[] args) {
    result = "Hi";
  }
}

А на Rebol разве можно писать на языках с разным синтаксисом?

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

И тогда он наконец перестанет быть лютым тормозом и сможет потягаться с ccl или даже с sbcl?

Если не ставить (safety 0), то уже сейчас вполне может потягаться. А с (safety 0) слишком легко вся среда выполнения валится.

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

Если не ставить (safety 0), то уже сейчас вполне может потягаться

И давно ли? Когда я в последний раз щупал рэкет, он производительностью не отличался. Кажется, была 5я ветка, хотя возможно, что и 6я.

А с (safety 0) слишком легко вся среда выполнения валится.

Ничего не валится, если подходить с умом и ставить check-type вместо declare type

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

по активности сообщества, по динамике развития

Это спорное утверждение. Если сравнивать quicklisp и pkg.racket-lang.org, то сравнение не в пользу Racket.

С другой стороны, сообщество Racket более цельное. Практически все библиотеки совместимы, а подходы единообразны. В Common Lisp много пакетов почти дублируют друг друга, а некоторые (hu.dwim, xcvb, lil) требуют всю программу переписывать в своём стиле.

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

Если не ставить (safety 0), то уже сейчас вполне может потягаться

И давно ли? Когда я в последний раз щупал рэкет, он производительностью не отличался. Кажется, была 5я ветка, хотя возможно, что и 6я.

А с (safety 0) слишком легко вся среда выполнения валится.

Ничего не валится, если подходить с умом и ставить check-type вместо declare type

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

Это спорное утверждение.

Почему же? Возьмём активность сообщества. Достаточно сравнить активность в списках рассылки Racket или того же SBCL, как всё становится очевидно в пользу Racket. Возьмём динамику развития. CL тухнет с 1994 года. Никаких новых идей, ничего нового в самом языке не наблюдается. Ну, да, появляются библиотеки, добавляются в QuickLisp, это да. Но развитие само языка застопорилось. Racket же развивается очень активно.

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

Первый комментарий в треде из Топ-10 месяца.

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

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

а они еще больше хотят фрагментировать коммьюнити? Одни будут пилить одно, другие своё и т.д.?

Они не фрагментируют. Они переходят. А поддержка множества систем времени выполнения такая же, как поддержка множества ядер ОС в Debian. Она же не приводит к фрагментированию несмотря на существование Debian Hurd и Debian kFreeBSD.

Hurd и kFreeBSD это те никому не нужные фиговины? OK, тогда понятна аналогия.

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

И давно ли?

https://benchmarksgame-team.pages.debian.net/benchmarksgame/faster/racket.html

Ничего не валится, если подходить с умом и ставить check-type вместо declare type

Если declare не использовать, то скорости не будет (будет как в Racket и медленнее, чем в Typed Racket). Кроме того, при safety 0 количество аргументов не проверяется.

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

Почему же? Возьмём активность сообщества. Достаточно сравнить активность в списках рассылки C++ или того же $борщнейм, как всё становится очевидно в пользу C++.

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

По сравнению со всем остальным — да. Людям интереснее софт писать, а не хайпы очередные разводить. Лично мне лет за 10 использования CL ничего «нового» не понадобилось от языка.

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

По сравнению со всем остальным — да. Людям интереснее софт писать, а не хайпы очередные разводить.

Лол :-) А вот если взять того же Fare, то он уже признал превосходство Racket над CL :-) И он ставит Racket на следующий уровень развития Лиспа :-)

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

Возьмём активность сообщества. Достаточно сравнить активность в списках рассылки Racket или того же SBCL

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

Никаких новых идей, ничего нового в самом языке не наблюдается.

Гибкость общелиспа позволяет их выполнить без необходимости внесения изменений в сам язык. Такие вещи как named-readtables, lisp-namespaces, cl-interpol или даже попытка осовременивания языка cl21 - все это просто библиотеки, наиболее удачные из которых становятся де-факто стандартными.

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

А на Rebol разве можно писать на языках с разным синтаксисом?

Можно конечно, в реболе просто PEG рантаймовый, что угодно можно воротить. Другое дело что это не очень практично, намного проще использовать реболовский синтакисис (он очень простой и эффективный) и поменять только семантику.

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

Я без тебя знаю, что делал Fare.

Видимо, не знал :-)

Свалил с CL на gerbil

Не свалил, а стал активно использовать и дорабатывать :-) Респект :-)

, значит не лиспер, туда и дорога.

Не лиспер, а талантливый программист, знающий Лисп и умеющий писать на нём сложный софт :-) Теперь вот на пути перехода на Racket, как на более мощный язык :-)

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

Если declare не использовать, то скорости не будет

Будет. check-type равноценен declare type, но с той лишь разницей, что первый оставляет после себя одну проверку.

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

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

Лол :-) Два взаимоисключающих утверждения :-)

Гибкость общелиспа позволяет их выполнить без необходимости внесения изменений в сам язык.

Эти сказки я слышал :-) В глубине души, каждый лиспер хотел бы увидеть обновлённый стандарт CL :-) Если бы такой стандарт вышел, то мы бы услышали уже другие песни от сторонников CL, которые сегодня поют про «достаточно одних только библиотек, новый стандарт не нужен» :-)

azelipupenko ()