LINUX.ORG.RU

Вышел Racket 6.4

 ,


4

3

Вышла версия 6.4 языка Racket — языка программирования общего назначения из семейства Lisp/Scheme.

  • Исправлена уязвимость в Web-сервере. Данная уязвимость позволяла получить доступ к любому файлу, доступному Web-серверу для чтения (подробности).
  • Новый инкрементальный сборщик мусора уменьшил паузы, что особенно важно в играх и анимациях.
  • Скроллинг в DrRacket стал быстрее.
  • Добавлен болгарский перевод в DrRacket.
  • Каталог пакетов теперь имеет адрес HTTPS по умолчанию, а не HTTP.
  • Документация теперь может определять свои собственные категории для главной страницы руководства с использованием строк.
  • Шпаргалка по Racket включена в основной дистрибутив.
  • Контракт, который Typed Racket генерирует для типа Any, стал более либеральным, что позволяет большему числу программ как с использованием системы типов, так и без неё работать без ошибок контракта.
  • Redex поддерживает спецификацию связей (binding specifications).
  • Все функции pict принимают pict-convertible, что обеспечивает прозрачное взаимодействие между pict и библиотеками типа 2htdp/image.
  • Команды raco profile и raco contract-profile предоставляют лёгкий доступ к инструментарию профилирования без необходимости изменять сами программы.

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

anonymous

Проверено: maxcom ()
Последнее исправление: Wizard_ (всего исправлений: 6)

Кстати никто сабж под андроид не собирал, а то у меня не выходило когда-то?

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

Сама кложура быстро стартует. Не медленнее иных лиспов. Долго она заводится из под leiningen и при обвешивании зависимостями. Это ад конечно и надо с этим что-то делать.

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

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

Ничего не изменилось, всё ещё не юзабельно под андроид.

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

Кложуру, думаю, рано или поздно, отвяжут от JVM.

Правда какие-то подвижки есть или это только твои мысли?

Мне кажется, что такие языки «намертво прибиты» к платформе. Если тебе не подходит JVM, то и на кложуру смотреть не будешь. И наоборот - если используешь, то привязываешься к имеющейся инфраструктуре. Скала вон на .Net вылазила, но там оказалась никому не нужна.

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

Да, её уже куда только не портировали... Спасибо, что подметил. Я имел в виду. что кложуру рано или поздно перетащат на свою собственную вм. Насчёт натива - как-то хз. Попадались в сети разговоры на эту тему, не более.

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

Я имел в виду. что кложуру рано или поздно перетащат на свою собственную вм.

Это будет началом конца. Более оптимального варианта «фичи ВМ + батарейки в комплекте» нет, если только не .нет :)

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

Я имел в виду. что кложуру рано или поздно перетащат на свою собственную вм.

И она не будет развиваться ещё медленнее чем Clojure под .Net. Т.к. большая часть библиотек Clojure основана на Java коде. Самые очевидные примеры - Leiningen (обёртка над Maven) и ring (обёртка над jetty).

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

в данный момент он работает на racket. и давно уже, на самом деле. и так же давно пытаемся выкинуть ракету и переписать все части на clojure и scala.

Спасибо за информацию. Не знал этого.

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

На jvm быстро стартует kawa. Кложура - долго. Работает kawa, кстати, тоже быстрее.

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

Для .net версия скорее мертва. Для js жива, но есть нюансы. И на всех платформах для взаимодействия с родным для платформы кодом приходится писать обертки из-за особой семантики кложуры. Правда сообщество обширное и написано довольно много.

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

Процесс долгий будет. Уже запущено несколько независимых проектов.
https://en.wikipedia.org/wiki/Pixie_(programming_language)
https://github.com/artagnon/rhine-ml
https://en.wikipedia.org/wiki/Hy
Но развиваются они по себе, хоть и под её (clj) влиянием,
т.е. официально как была кложура на jvm, дотнете и js, так и остаётся.

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

Процесс долгий будет.

Весь вопрос в том, для чего нужна Clojure под что-то более нативное чем JVM или CLR?

И да, из приведённых проектов что-то может получится только из Hy.

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

Почему гигиена «смущает умы»?

Потому что без гигиены данные = код = список. Идентификаторы в macroexpand'е соответствуют контексту раскрытия. И вообще, всё вроде очевидно. А с гигиеной у идентификатора есть контекст.

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

Кто-нибудь, расскажите этому балбесу про gensym.

Ну и куда ты воткнёшь здесь gensym?

(defmacro fwrite (stream x)
  `(aif ,stream (format it "~a" ,x) nil))

(fwrite t 3) ;  => 3
(aif 3 (fwrite t it)) ; => t
monk ★★★★★
()
Ответ на: комментарий от x4DA

олсо в гигиеничской системе нельзя ввести в скоупинг переменную «неявно»

Ты про aif и it? И это не ко мне...

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

Ну и куда ты воткнёшь здесь gensym

Возьму и воткну:

(defun subst-expr (expr var val)
  (cond ((consp expr) (cons (subst-expr (car expr) var val) (subst-expr (cdr expr) var val)))
        ((equalp expr var) val)
	(t expr)))
(defmacro aif (test then &optional else)
  (let ((sym (gensym)))
    `(let ((,sym ,test))
       (if ,sym ,(subst-expr then 'it sym) ,(subst-expr else 'it sym)))))

(defmacro fwrite (stream x)
  `(aif ,stream (format it "~a" ,x) nil))

(fwrite t 3) ;  => 3
(aif 3 (fwrite t it)) ; => 3
q0tw4 ★★★★
()
Последнее исправление: q0tw4 (всего исправлений: 1)
Ответ на: комментарий от q0tw4

Правда наверно надо еще останавливать рекурсию subst-expr если натыкаешься на другой aif, так что да, гемороя не оберешься, но зато процесс создания макросов зависит только от тебя и не требует глубокого понимания того, как устроены области видимости твоего лиспа и закапывания в доки про десятки функций работы с макросами. Есть defmacro, gensym, macroexpand[-1] и есть обычный исполняемый лисп. Все остальное в твоих руках.

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

То есть предлагаешь изменить библиотечный aif. И получить неверную работу, например для

> (aif t (format it "~a" '(it is ok)) nil)
(G3210 IS OK)

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

Библиотечный всеравно некошерен. Ну ок, остановим subst-expr при попадании в quote. Я говорю о том, что некоторым больше по душе долго собирать абстракции из примитивных механизмов, чем разбираться, что наворотили особо умные мужики в своих яп, и как там защиту обходить когда сильно надо. Были бы подробные видеоуроки по ракету, комонеров в мире стало бы гораздо меньше.

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

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

Вот это и есть основной лозунг CL.

Фактически, для реализации правильного aif придётся написать полноценный парсер всего CL (с поддержкой макросов и таблиц чтения) с гигиеной (отслеживанием контекста) в стиле Scheme.

Зато «не требует глубокого понимания того, как устроены области видимости твоего лиспа и закапывания в доки про десятки функций работы с макросами». Кстати, DarkEld3r, вот тебе наглядный пример, почему гигиена «смущает умы».

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

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

видеоуроки

OMG, «комонеры» не умеют читать? У ракетки отличная документация.

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

И вообще я про aif узнал из http://letoverlambda.com/index.cl/guest/chap6.html и то что он библиотечный не в курсе. Собственно я не особо то и лиспер. В молодости увлекался, но тогда даже и не знал о макросах, юзал просто так. Кое-что мелкое делал на ракете и коммоне когда что больше нравилось. В данный момент вот пробую таки осилить древнюю задуму с лисподобным си с аст-макросами. Пишу на сабже как раз. Но не думаю что мне тут макросы пригодятся. Будет просто quasiquotированный лиспо-си код с обычным спискогенерированием. Собственно я транслятор делаю, так что гигиена там не нужна.

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

Ну ок, остановим subst-expr при попадании в quote.

Ещё надо учесть конструкции типа (abc it), где abc — макрос. Причём макрос может быть типа

(defmacro debug (sym)
  `(format t "~a = ~a~%" ',sym ,sym))

Как будешь обрабатывать (aif t (debug it) nil) ?

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

Мне такими словами один мужик доказывал, что Жигули лучше чем Toyota. ;-).

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

Есть достаточно подробный учебник: https://docs.racket-lang.org/guide/index.html . Мне хватило.

Проблема не в этом, а в мировоззрении. Для комонера важна простота семантики, для схемера — корректность работы. Скажем, iterate в CL никто не будет переносить в схему только по той причине, что он позволяет писать очень неочевидный код. Например,

(iter (for i from 1 to 10) 
      (when (> i 15) 
          (collect i) 
          (finally (princ "why"))))
вернёт nil, так как (> i 15) всегда ложь, но «why» напечатает.

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

У ракетки отличная документация.

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

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

с лисподобным си с аст-макросами. Пишу на сабже как раз. Но не думаю что мне тут макросы пригодятся.

Так «с аст-макросами» или «не думаю что мне тут макросы пригодятся»?

Посмотри L++

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

эта макросовая мозголомка

(define-syntax rotate
  (syntax-rules ()
    [(rotate a) (void)]
    [(rotate a b c ...) (begin
                          (swap a b)
                          (rotate b c ...))]))

тяжело воспринимается?

По сравнению с

(defmacro rotate (a &rest r)
  (when (>= (length r) 2)
    `(progn
       (swap ,(car r) ,(cadr r))
       (rotate ,@(cddr r))))
?

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

Это ад конечно и надо с этим что-то делать.

По моему ни разу не проблема. Потому что за весь процесс работы её как правило надо запустить только один раз.

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

Ещё надо учесть конструкции типа (abc it), где abc — макрос

Плавно приходим к racket way (врядли реально починить все случаи с eval, вытаскиванием за контекст и прочим)

(defmacro aif (it-sym test then &optional else)
  `(let ((,it-sym ,test))
     (if ,it-sym ,then ,else)))

(defmacro fwrite (stream x)
  (let ((it (gensym)))
    `(aif ,it ,stream (format ,it "~a" ,x) nil)))

(fwrite t 3) ;  => 3
(aif it 3 (fwrite t it)) ; => 3

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

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

верну ка я if вместо aif и будет мне счастье.

Если приходится писать (let ... gensym ... aif ...) вместо (if ...), так конечно. То есть вернулись к моему исходному утверждению: в CL анафорические макросы внутри макросов применять нельзя.

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

в CL анафорические макросы внутри макросов применять нельзя.

Да, но от этого никому из тех, кто всерьёз пишет на CL, ни жарко, ни холодно :-) Точно так же, как и тем, кто всерьёз пишет на C, ни жарко, ни холодно от того, что в C++ по-мимо указателей есть ещё и ссылки :-) Точнее, сишники вздыхают с облегчением :-)

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

Да, но от этого никому из тех, кто всерьёз пишет на CL, ни жарко, ни холодно

Согласен. Поэтому и говорю, что никакая самая лучшая документация по Racket на количество комонеров почти никак не повлияет.

Точно так же, как и тем, кто всерьёз пишет на C, ни жарко, ни холодно от того, что в C++ по-мимо указателей есть ещё и ссылки :-) Точнее, сишники вздыхают с облегчением :-)

Ссылки ладно, а вот как сишники живут без шаблонов и RAII я не понимаю. Неужели тоже вздыхают с облегчением?!

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

Такой вот парадокс, коммон сложнее и запутаннее ракеты, но достаточно глубоко освоить его почему-то гораздо проще.

В реальном проекте всем глубоко плевать на волшебные переменные типа it и прочие якобы полезные макросы общего назначения. Вон в том же питоне от this специально отказались с целью повысить читабельность. Если рассматривать макросы не общего назначения, а специфичные для задачи, то там обычно достаточно оговорить ограничения использования и все норм.

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

а вот как сишники живут без шаблонов

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

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

Ссылки ладно, а вот как сишники живут без шаблонов и RAII я не понимаю. Неужели тоже вздыхают с облегчением?!

Представь себе, да :-) И без навязанных паттернов тоже :-) Ну вот, например Why should I have written ZeroMQ in C, not C++ Как и без последнего писка моды - запутанных правил вывода типов аля как с помощью многоэтажной шапки шаблона заставить компилятор находить (автоматически или вручную) сгенерированный конструктор копирования, если объявлен шаблон конструктора с forwarding reference :-) И что это за RAII такое в C++, где деструктор даже даже исключение сгенерить не может :-) То ли милое дело в CL - сигналы :-)

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

Такой вот парадокс, коммон сложнее и запутаннее ракеты, но достаточно глубоко освоить его почему-то гораздо проще.

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

Но именно из-за этого как только человек более-менее сносно осваивает CL, то начинает «делать удобнее». Так как макросы (и тем более таблицы чтения) вроде позволяют. Так родились https://common-lisp.net/project/xcvb/ вместо asdf, https://github.com/fare/lisp-interface-library, https://github.com/Kalimehtar/advanced-readtable, https://github.com/Kalimehtar/message-oo, набор библиотек hu.dwim, пачка самодельных лиспов. Беда в том, что каждый проект такого рода сегментирует доступные библиотеки. Ситуация получается аналогичной GTK/Qt при разработке GUI. Смешать компоненты из двух библиотек нельзя.

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

Представь себе, да :-) И без навязанных паттернов тоже :-)

При том, что C++ никак нельзя обвинить в плохой или недостаточной документации :-).

Именно поэтому споры на тему «какой язык лучше» называются религиозными. Аргументировать можно, убедить оппонента — почти никогда.

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

При том, что C++ никак нельзя обвинить в плохой или недостаточной документации :-).

Кстати, можно :-) Ты читал когда-нибудь стандарт C++? :-) Удовольствия много получал от чтива? :-) Я - нет :-) Гораздо понятнее, доступнее, и быстрее читаются маны по системным сишным функциям на локалхосте, либо маны по либам, чем стандарт C++ или html-доки по либам на нём :-) Ну сложный язык, сложный, что поделать :-) Потому и доки сложные :-)

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

Ты читал когда-нибудь стандарт C++? :-) Удовольствия много получал от чтива?

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

Гораздо понятнее, доступнее, и быстрее читаются маны по системным сишным функциям на локалхосте

Сравнил man realloc с https://ru.wikipedia.org/wiki/Vector_(C++)

В мане ни примеров, ни упоминания, что возможен UB.

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

Ну сложный язык, сложный, что поделать :-) Потому и доки сложные

Кстати, можно сравнить доки по Gtk и Qt (возможности примерно одинаковые). Дока по Gtk читается тяжелее.

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

И вообще, всё вроде очевидно. А с гигиеной у идентификатора есть контекст.

Так-то да, просто я привык к тому, что «не смущать неокрепшие умы» = уменьшать возможности по выстрелу в ногу, а окрепшие с гигеной разобраться осилят.

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

древнюю задуму с лисподобным си с аст-макросами

Ну вот, опять недогуглил ;(( http://docs.racket-lang.org/c-utils и ничего писать на этом этапе уже не надо. Что за напасть такая, когда гуглишь нету, как делаешь - так случайно натыкаешься.

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

«не смущать неокрепшие умы» = уменьшать возможности по выстрелу в ногу

Можно и так считать. Выстрел в ногу в стиле

(define-syntax (test stx)
  (with-syntax ([id (syntax-local-introduce #'foo)])
    #'(define id 1)))

(define-syntax (test2 stx)
  (with-syntax ([id (datum->syntax stx 'foo2)])
    #'(define id 1)))

(define-syntax-rule (yoba1)
  (test))

(define-syntax-rule (yoba2)
  (test2))

(yoba1)
foo

(yoba2)
foo2

---- запуск
. foo2: unbound identifier in module in: foo2

вполне возможен.

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