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)

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

Ты нигде не спрашивал, не сочиняй

Ты докапываешься до слов. Аргументы я таки просил.

Скажи, с чем сравнить

Хорошее, конечно, познаётся в сравнении, но я не дам тебе такого инструмента. Гораздо проще найти причины негодности какого-то языка, чем дать аргументы в пользу того языка, в пользу которого у тебя их нет. Нет уж, попробуй обозначить фичи Фортрана, которые делают его незаменимым языком для «учёных» (слишком уж они у нас сферические в вакууме, уже как-то забавно).

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

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

ну вот, фортран последних редакций. хотя, кому-то хватает и 77

Мне тут в уши льют, что все учёные как один умеют только в Фортран, юзают только его, а альтернатив никаких нет и быть не может. Конечно же это не так.

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

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

Остаётся только наступить на горло своему вкусу

Именно. Я об этом и твержу весь тред. Если бы разрабы умели держать в узде свои прихоти, всякие паскали бы уже померли (хотя он и так, просто некрофилы от него ещё не отстали), а всякие котлины бы никогда не родились.

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

ну вот, фортран последних редакций. хотя, кому-то хватает и 77

Речь про Фортран зашла как раз после того, как я сказал, что в Фортране всё нужное есть. Вот только это не про выразительную мощь, не про активное сообщество (ну поди погугли учебные материалы, там тлен) и не про современные инструменты разработки. А жить-то, конечно, можно, да.

здесь на ветке я такого не наблюдаю

Плохо наблюдаешь. Смотри внимательней, я практически не преувеличил.

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

Пожалуйста. Скорость компиляции, скорость исполнения, модули, многомерные массивы (с проверкой выхода за границу, привет, С), намеренно простой и топорный синтаксис, который невозможно истолковать неправильно, поддержка комплексных чисел и всех базовых функций для них (модуль, аргумент, синус, возведение в степень). Да хотя бы тот же оператор возведения в степень. Минимум ключевых слов и возможностей сделать удивительные ошибки на ровном месте (привет, С++, где мало кто знает язык полностью). Отсюда следует, что любой новичок может прийти в проект и не испоганить его. Поэлементные операции над массивами любой размерности (типа A=B+С, C=A*B, abs(A), где A, B, C — массивы), а также любая пользовательская функция, которая может работать с одним аргументом, может принимать и целый массив — совершенно бесплатно, достаточно добавить в её определение одно слово. Динамические массивы, которые расширяются автоматически (например, a=[a,c]), где c — ещё один массив.

Короче говоря, в основном — очень простое обращение с массивами, с минимумом лишнего синтаксиса (обычно — вообще без него). Именно это в большинстве случаев и нужно сферическим учёным, хотя и не всем.

В каком языке (одном) всё это есть? Ответ — Python, Nim, Julia. Почему они не годятся? Потому что медленные.

Понятно, что всё это можно реализовать на том же С++ или Rust, хотя придётся попотеть, чтоб ещё всё это оптимизировать по скорости выполнения. Только это всё равно будет дополнительная библиотека, дополнительный синтаксис, который нужно учить.

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

ну поди погугли учебные материалы

Книжка Metcalf и кто-то ещё вышла не так давно, покрывает последний действующий стандарт, в ней всё есть.

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

работа в образе поощряет не писать тесты и создаёт невоспроизводимую среду, мощный отладчик поощряет забивать на проверку входных данных и писать программы, которые не понимает сам разработчик

Что это, вот в смолтоке с теми же фичами все ровно наоборот

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

все эти «осишенные паскали» тоже надо закопать?

Вот, кстати, как раз «осишенные паскали» неплохо бы закопать. Уродливый синтаксис.

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

Плохо наблюдаешь. Смотри внимательней, я практически не преувеличил

нет, не наблюдаю

ну поди погугли учебные материалы

а вот учебные материалы наблюдаю даже здесь в теме не про фортран. фортран - он везде.

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

пускай будут, это же плюсы «с человеческим лицом»

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

привет, С++, где мало кто знает язык полностью

Цепепе не знает полностью никто. Это невозможно.

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

полвека уже мучают этот юникс, старьёвщики

Ох, спаси нас, святой МакКарти и пророк его Ричард П. Гэбриел.

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

Если бы разрабы умели держать в узде свои прихоти, всякие паскали бы уже померли (хотя он и так, просто некрофилы от него ещё не отстали), а всякие котлины бы никогда не родились.

Я же говорю, фюрера на них нет. Не желаешь занять эту вакантную должность? Будешь твёрдой рукой направлять развитие одного языка (выберешь, который нравится лично тебе), а остальные вычеркнешь из истории.

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

направлять развитие одного языка, а остальные вычеркнешь из истории.

У нас уже есть Nenad Rakocević, остается только поддерживать, кидать зиги, вот это вот всё.

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

У нас уже есть Nenad Rakocević, остается только поддерживать, кидать зиги, вот это вот всё.

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

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

Никто не мешает тебе манипулировать классами как значениями

И твой «class» становится такой же переменной как в lisp-1. И назвать экземпляр этого класса «class» уже нельзя. Отсюда приходим к frame% как имя класса и frame как имя экземпляра или любому другому соглашению об именах.

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

поэффективнее кэшировать на стороне клиента

Если просто кэшировать, то iframe придуман 30 лет назад. А вот если формирование страницы делать на клиенте, то приходится чтобы «пользоваться планшетом или телефоном» ставить туда 8-ядерный процессор и памяти как на среднем сервере.

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

CSS, как правило, для этого достаточен.

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

Например, предоставлять готовые механизмы для реализации длинных/асинхронных запросов и прочих пуш-нотификаций

Этого вроде нет. Пуш-нотфикации — это Google FCM? Тогда скоро будет (мне понадобилось).

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

Кстати, если в курсе, как с этим в современных популярных схемах (guile, chicken, gambit)?

Примерно также, но синтаксис дополнительных параметров разный.

Например, то что в racket

(require (prefix-in m: (rename-in mod foo bar)))

в guile будет:

(require mod
         #:prefix m:
         #:renamer (lambda (x) (if (eq? x 'foo) 'bar x)))

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

Что это, вот в смолтоке с теми же фичами все ровно наоборот

Ткнулся в первый попавшийся проект https://github.com/len/Mathematics . Что-то не вижу в методах проверки входных параметров. То есть при попытке вместо ожидаемого числа дать строку, получишь ошибку уже в потрохах метода.

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

Могу перечислить чего мне не хватило и из-за чего я ушёл на Racket.

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

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

среда выполнения

Это runtime environment.

Или как по-русски будет: «The runtime system is the gateway by which a running program interacts with the runtime environment»?

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

Тоже неправильно. (fwrite nil (do-something-dangerous)) не должен ничего выполнять, а у тебя сначала выполнится (do-something-dangerous), а потом проверится условие.

(defmacro with-rebind-defend (vars forms env &body code)
  (alexandria:with-gensyms (varss vars-gs s)
    `(let ((,varss (loop :for ,s :in ',vars
                         :when (member (sb-cltl2:variable-information ,s ,env)
                                       '(:special :lexical))
                           :collect ,s)))
       (if ,varss
           (let* ((,vars-gs (mapcar (lambda (s) (gensym (symbol-name s)))
                                    ,varss))
                  ,@(mapcar (lambda (f)
                              `(,f (list 'let (mapcar #'cl:list
                                                      ,varss ,vars-gs)
                                         (list 'cl:declare (list* 'cl:ignorable
                                                                  ,varss))
                                         ,f)))
                            forms))
             (list 'cl:let (mapcar #'list ,vars-gs ,varss)
                   ,@code))
           ,@code))))

(defmacro fwrite (stream x &environment env)
  (with-rebind-defend (it) (x) env
    `(aif ,stream (format it "~a" ,x) nil)))
ados ★★★★★
()
Ответ на: комментарий от monk

Но вообще да - городить такой макрос как with-rebind-defend ради такого пустякового fwrite - из пушки по воробьям. Легче aif не пользоваться в данном случае.

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

...часто сокращается до просто runtime.

Так в теме речь про runtime system. Предлагаешь переводить как «система среды выполнения»?

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

Предложите на чем начинать мне писать программу. Без шуток. С программированием знаком поверхностно, на уровне бейсика/паскаля. Одно время была попытка осилить с++, но завяз в указателях/ссылках. Смотрел на python.

Требуется написать программу с графическим интерфейсом как например у inkscape/freecad/blender/sketchap. То есть нужен специализированный, чертежный софт. Работа с вектором 2D + чертежи 3D. Можно отдельные две программы 2D и 3D.

Существующий, озвученный, софт не позволяет делать то, что нужно. Или слишком сложен или не удобен. И написать плагины к нему не выход.

Так вот на чем можно такое написать человеку не осилившему с первого(второго) раза с++/Qt5? Какой язык учить? В чем это делать легко? Все-таки пытаться понять ссылки и указатели в с++? PyQt5? Он справиться? Там тоже есть указатели и сложные моменты.

Писал несложный софт еще на processing. Пишется легко, есть удобные библиотеки для gui и графики, но это java. И программы получались несколько медленные. Хотя вот смотрю на sweet home 3D и вижу нормально получилось на java. На на самой jave еще сложнее писать там куча public/privat и т.п.

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

то Паскаль — почти единственный вариант

Напомню, первый фотошоп был написан на паскале. Первая система для макинтош, о боже, была тоже написана на паскале.

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

Первый gcc был написан на паскале?

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

Вообще от яп иногда мало что зависит, а зависит от квалификации программиста.

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

Если вдруг два модуля экспортируют одинаковое имя, то мне придётся либо выбрать из них одно, либо переименовать одно из них при импорте (кстати, этого тоже не хватает в CL), но даже в этом случае я увижу ошибку сразу при require, а не когда у меня сломается случайный библиотечный макрос.

(defpackage :p1
  (:export :s1 :s2))

(defpackage :p2
  (:export :s1 :s3))
CL-USER> (defpackage :p3
           (:use :p1 :p2))
; Evaluation aborted on #<NAME-CONFLICT {10029CF633}>.
CL-USER>
ados ★★★★★
()
Ответ на: комментарий от monk

Так в теме речь про runtime system. Предлагаешь переводить как «система среды выполнения»?

Если тебя не устраивает просто «рантайм» - да.

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

А кто второй я? Может, мы с ним не знакомы, как истинно раздвоенные личности.

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

Если просто кэшировать, то iframe придуман 30 лет назад.

Ох. Если «просто кэшировать», то браузер клиента взорвется после пары часов работы. Даже с учетом загрузок по требованию, пейджирования и прочих серверных оптимизаций там сотни мегабайтов информации в клиент прилетают, есичо.

А вот если формирование страницы делать на клиенте, то приходится чтобы «пользоваться планшетом или телефоном» ставить туда 8-ядерный процессор и памяти как на среднем сервере.

Нет, на штатном app-сервере у нас 256G и 56 ядер. Есть ещё другие типы серверов в комплексе, там памяти и проца поменьше.

А вот клиенты — это обычные офисные машинки или доступные мобильные устройства. Например, поддерживаемым минимумом для мобильных объявлен iphone 5s или современные ему.

CSS, как правило, для этого достаточен.

Для того, чтобы сделать другой набор вьюшек (считай, страничек)? Ну-ну.

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

Пуш-нотфикации — это Google FCM?

Как вариант. Но не единственный возможный, понятное дело.

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

А вообще, так не честно. Ты-то видишь user-agent сообщения, а я нет.

Я просто тот русский хакер который избрал Трампа. Используя CL, ессно.

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

Если вдруг два модуля экспортируют одинаковое имя, то мне придётся либо выбрать из них одно, либо переименовать одно из них при импорте (кстати, этого тоже не хватает в CL), но даже в этом случае я увижу ошибку сразу при require, а не когда у меня сломается случайный библиотечный макрос.

Другое дело когда экспортируешь пакет и локально переопределяешь ненужный тебе символ из этого пакета, который хотя тебе и не нужен но тем самым меняет поведение нужных экспортированных функций. Но тогда тебе никто не мешает не импортировать всё что предлагает пакет библиотеки, а использовать import с перечислением нужных тебе символов. И не надо ничего учить наизусть - ты и так эти символы знаешь раз собираешься использовать.

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

; Evaluation aborted on #<NAME-CONFLICT {10029CF633}>.

А теперь как мне сделать, чтобы были доступны все четыре имени? p1:s1, например, под именем s1a?

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

не импортировать всё что предлагает пакет библиотеки, а использовать import с перечислением нужных тебе символов

Где-то так и приходится. Или, если библиотека позволяет, то вообще импортом не пользоваться, а всё писать через имя пакета.

Кстати, при попытке убрать что-то из перечисления в import-from всё ломается. В смысле, символ не отвязывается. :-(

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

Тут так не принято :)

Вот разработчики Racket про это и пишут. Поэтому и нету там хорошего отладчика и больше нету разработки в образе.

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

Шикарно! Докрутить ещё анализатор, чтобы списки vars и forms формировались автоматически по телу макроса и будет почти как на схеме. А зачем там условие :when (member (sb-cltl2:variable-information ,s ,env) ...) ?

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

А зачем там условие :when (member (sb-cltl2:variable-information ,s ,env) ...) ?

CL-USER> (let ((x y))
           x)

; in: LET ((X Y))
;     (LET ((X Y))
;       X)
; 
; caught WARNING:
;   undefined variable: Y
; 
; compilation unit finished
;   Undefined variable:
;     Y
;   caught 1 WARNING condition
; Evaluation aborted on #<UNBOUND-VARIABLE Y {1002E42C53}>.
CL-USER> 
ados ★★★★★
()
Ответ на: комментарий от ados

Шут его знает. Может можно приделать обработку UNBOUND-VARIABLE condition, чтобы избежать использования всякой дичи из CLTL2.

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

Докрутить ещё анализатор, чтобы списки vars и forms формировались автоматически по телу макроса и будет почти как на схеме.

То есть а самим управлять куда котекст должен протекать а куда нет ты не хочешь?

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

и больше нету разработки в образе

Вот не троллинга ради

-- нету разработки в образе

-- язык определен не как операции над лисп объектами в памяти

Почему это считается лиспом я не пойму? Из-за скобок чтоль? Reader-то хоть есть как отдельная стадия? Аналог eval-when?

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