LINUX.ORG.RU

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

 , ,


4

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 поддерживает функции с именованными аргументами.

>>> Оригинал



Проверено: jollheef ()
Последнее исправление: Deleted (всего исправлений: 1)

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

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

Virtuos86 ★★★★★
()

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

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

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

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

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

Надеюсь, а то что‐то давно я лишпосрачей не видел.

rotfront
()
Ответ на: комментарий от 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 ★★★★★
()

Тяжело продираться через надмозг.

Aceler ★★★★★
()

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

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 ★★★★★
()
Ответ на: комментарий от azelipupenko

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

Жесть. Не задавался вопросом почему?

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

Ракет конечно намного популярнее раста, но срачегонность не та.

Если бы борщелисперы подтянулись. А то скимеры одни поют осанну рэкету в треде).

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

И давно ли?

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

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

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

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

Жесть. Не задавался вопросом почему?

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

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

Именно так. Будет Racket на базе Chez Scheme. И никому не нужные фиговины, использующие возможность заменить базовую реализацию.

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

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

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

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

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

Ракет конечно намного популярнее раста

Как ты мерял?

Вероятно, опрос общественного мнения...

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

Вероятно, опрос общественного мнения...

Ходил по домам и опрашивал?

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

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

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

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

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

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

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

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

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

И какие-же преимущества предоставляет лисп в задачах обработки SVG?

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

Лол

Хренол. Я без тебя знаю, что делал Fare. Свалил с CL на gerbil, значит не лиспер, туда и дорога.

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

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

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

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

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

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

Свалил с CL на gerbil

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

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

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

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

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

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

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

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

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

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

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

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