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)

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

И как там с хранением строки исходника в АСТ

Судя по документации, никак.

Ага, вот она киллерфича ракета. Жалко только всякие трейсы ракет показывает через одно место. Бывает вообще пишет сообщение про ошибку компиляции и никакой ссылки где она. Конкретно я сейчас не вспомню что и где багало, но в принципе в 80% случаев ошибок в макросах он показывает в трейсе не совсем то, что ожидаешь. Кучу внутренних кодов таких как for.rkt - пожалуйста, где же реально бага - попробуй найди.

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

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

А с гуем в ниме печаль: https://github.com/yglukhov/nimx вот это убожество. Ну ракет с гуем пусть и не фонтан, но вроде как буквы из эдитов не выпрыгивают. Впрочем другие SDL виджеты были на порядок бажнее, тут хоть и стыдно, но все тыкается минимум.

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

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

Tail-call optimization. Стек последним вызовом затирается.

Посмотри https://github.com/Kalimehtar/binary-class/blob/master/binary-class/syntax.rkt , make-reader.

Там я, чтобы добавить дополнительный фрейм, делаю

(call-with-values ;; add frame to prevent TCO
  (λ () (read-value 
           (values->maybe-list FTYPE) in ARG ...))
   values))
вместо
(read-value (values->maybe-list FTYPE) in ARG ...)

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

Хмм, а там можно как в ракете, написать функцию, которая генерит АСТ в рантайме, а потом уже вызвать ее в макросе?

Разумеется.

А вот и нельзя: «Since version 0.12.0 of the language, a proc that uses system.NimNode within its parameter types is implictly declared compileTime». Сижу думаю как его вырубить то.

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

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

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

Итого в моей задачи ракет рвет ним по следующим пунктам:

  • Repl
  • Может выполнять трансляцию синтаксиса в рантайме
  • Помнит location ДСЛ сорца
  • Без parameterize я как без рук
  • Легко решает серьезные проблемы трансляции, а именно уберкиллерсупер фича make-set!-transformer, позволяющая аккуратно переписывать использование переменной в уже сгенеренном коде. Впрочем эта фича работает только если генерировать в ракет. Что-то не думаю я, что в ниме можно так вот просто применить к участку генерируемого кода макрос, переписывающий все присваивания в локальную переменную
q0tw4 ★★★★
()
Ответ на: комментарий от monk

Да кстати вот тебе все не нравилось, что у меня слишком екзотический компилятор. А что если попробовать пойти другим путем, сделать мой ДСЛ как расширение ракета, тоесть чтоб модули на моем ЯП были модулями ракета, узающими особые версии функций и макросов типа + и прочих, которые работают так же и с новыми типами данных, такими как signal, возвращая при этом уже signal. signalами будут простые структуры, собирающиеся в ациклический граф. Ну и само собой будут конструкторы типа signal. Таким образом я предоставлю узеру всю макрокухню ракета с его средствами и гигиеной нисколько не усложняя последущую компиляцию того, что осталось не вычисленным в компилтайме в си.

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

А что если попробовать пойти другим путем, сделать мой ДСЛ как расширение ракета, тоесть чтоб модули на моем ЯП были модулями ракета

Вот это и будет традиционный подход.

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

Не очень понял про «не усложняя последущую компиляцию». Так всё-таки модуль Racket или малого подмножества Racket? Если модуль Racket, то в общем случае его невозможно скомпилировать в Си.

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

signalами будут простые структуры, собирающиеся в ациклический граф.

Или компилируем не программу, а только сигналы?

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

Или компилируем не программу, а только сигналы?

ага. Программа это просто билдер сигналов.

Кста для полной красоты придется все функции переделать в макросы для того чтоб сохранять синтаксы в сигналах. А именно там будет нечто вроде

(define-syntax (test stx)
  #`(cons #'#,(stx-cdr stx) #,(stx-cdr stx)))
> (test + 2 3)
'(#<syntax (+ 2 3)> . 5)
> (syntax-line (car (test + 2 3)))
#f

Или для такого хватит макроса #%app?

Только как это написать чтоб позицию выдавало из stx непонятно.

q0tw4 ★★★★
()
Последнее исправление: q0tw4 (всего исправлений: 1)
Ответ на: комментарий от q0tw4
(define-for-syntax (as-stx stx pos-stx)
  #`(datum->syntax #f
                   '#,stx
                   (list #,@(map (λ (x) `(quote ,(x pos-stx)))
                                 (list syntax-source
                                       syntax-line
                                       syntax-column
                                       syntax-position
                                       syntax-span)))))

(define-syntax (test stx)
  #`(cons #,(as-stx (stx-cdr stx) stx)
          #,(stx-cdr stx)))
monk ★★★★★
()
Ответ на: комментарий от monk

Гы, а в контексте module lang as-stx не работает. Зато работает без него:

(begin-for-syntax (define-struct wrap (source value) #:transparent))

(define-syntax (datum stx)
  (datum->syntax #'1 (wrap (stx-cdr stx) (syntax-e (stx-cdr stx)))))

Кстати, что это за глюк #%plain-module-begin: unbound identifier; когда узаешь #%plain-module-begin в качестве #%module-begin и запускаешь модуль с репла (module test «lang.rkt» 1). С файла #lang s-exp «lang.rkt» работает норм. И где принцип наименьшего удивления в ракете?

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

Хотя нет, работает это только в репле самого модуля. При попытке сделать require из другого места получаю write: cannot marshal value that is embedded in compiled code. Ну тоесть нельзя делать syntax из структуры. Ну вот опять черная магия пошла. Ну почему в ракете все так нелогично.

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

модуль с репла (module test «lang.rkt» 1). С файла #lang s-exp «lang.rkt» работает норм.

(module test «lang.rkt» 1) не меняет язык, а всего лишь в рамках текущего языка создаёт модуль с импортированным lang.rkt вместо racket. Если у тебя не экспортируется #%plain-module-begin из lang.rkt, то ошибка очевидна.

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

При попытке сделать require из другого места получаю write: cannot marshal value that is embedded in compiled code.

Всё правильно. В текущем контексте у тебя нет типы этой структуры, а в импортируемом коде есть. Как экземпляр создавать?

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

Ну там использование было бажное. Короче основная проблема как переопределить #%datum так, чтоб после его применения получался код, содержащий в себе датумы, но не зависал циклически применяя к нему #%datum?

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

Короче основная проблема как переопределить #%datum так, чтоб после его применения получался код, содержащий в себе датумы, но не зависал циклически применяя к нему #%datum

(provide #%datum)

Или, если надо что-то своё, то

(require (prefix-in r: racket))

(define (#%datum ....) (if .... (r:#%datum ....) ....))

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

Ну наверно я имел ввиду это

#lang racket

(provide (except-out (all-from-out racket)
                     #%datum)
         (rename-out [datum #%datum])

(define-syntax (datum stx)
  #`(cons #,(as-stx (stx-cdr stx) stx)
          #,(datum->syntax #'1 (syntax-e (stx-cdr stx)) stx)))

Только он теперь «cons: unbound identifier;» говорит и (require (for-template racket/base)) не помогает (при попытке сделать (require «some-module using #lang s-exp thismodule»)).

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

То есть (define-syntax (#%datum stx) (if .... #'(r:#%datum ....) ....))

monk ★★★★★
()
Ответ на: комментарий от q0tw4
; a.rkt
#lang racket
(require (for-syntax syntax/stx))
(provide (except-out (all-from-out racket)
                     #%datum)
         (rename-out [datum #%datum]))

(define-for-syntax (as-stx stx pos-stx)
  #`(datum->syntax #f
                   '#,stx
                   (list #,@(map (λ (x) `(quote ,(x pos-stx)))
                                 (list syntax-source
                                       syntax-line
                                       syntax-column
                                       syntax-position
                                       syntax-span)))))

(define-syntax (datum stx)
  #`(cons #,(as-stx (stx-cdr stx) stx)
          #,(datum->syntax #'1 (syntax-e (stx-cdr stx)) stx)))

; b.rkt
#lang s-exp "a.rkt"

10

; запуск
'(.#<syntax:b.rkt:3:0 10> . 10)
monk ★★★★★
()
Ответ на: комментарий от monk

наверно сломало то, что я еще заекспортил как #%module-begin

(define-syntax-rule (module-begin expr ...)
  (#%plain-module-begin (require racket) (display expr) ...))

#'(r:#%datum ....)

#%datum - это же почти синоним quote. Если его вызвать, он мне просто заквотит выражение внутри. А мне надо получить на выходе не выражение, а его значение, только без зацикленного перезапуска #%datum. Вот для того я перебрасую значение из ДСЛ модуля к себе в ракетмодуль с помощью ребиндинга к простой константе моего модуля.

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

Вот для того я перебрасую значение из ДСЛ модуля к себе в ракетмодуль с помощью ребиндинга к простой константе моего модуля.

Логичнее так:

(define-syntax (datum stx)
  #`(cons #,(as-stx (stx-cdr stx) stx)
          (#%datum . #,(stx-cdr stx))))

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

Та да, ломает не это. Вот попробуй запустить консоль из «a.rkt» и в ней сделать (require «b.rkt»). Имеется ввиду консоль из кнопки run над модулем.

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

запустить консоль из «a.rkt» и в ней сделать (require «b.rkt»)

Если именно из a, тогда ломается. Видимо racket не импортируется.

P.S. Да

> (require "b.rkt")
. cons: unbound identifier;
 also, no #%top syntax transformer is bound in: cons
> (require racket)
> (require "b.rkt")
(.#<syntax:b.rkt:3:0 20> . 20)
monk ★★★★★
()
Ответ на: комментарий от monk

В общем, судя по всему, при запуске из a.rkt не отрабатывает нормально #lang s-exp a.rkt (модуль как бы уже загружен и не загружается повторно).

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

Ну как я и говорил: принцип наименьшего удивления нарушен. Вообще выходит что есть 2 диаметрально противоположных подхода к языку программирования. С одной стороны язык, который много чего умеет из коробки как perl6, но при этом будет регулярно удивлять и требовать консультаций на форумах (ну можно конечно читать сорцы его стдлибов, но там сложно ориентироваться). Либо язык минималистичен как self и все его возможности реализованные в стдлибе доступны к понимаю поскольку используют только элементарные строительные блоки без всякой черной магии типа макросов. В связи с тем, что я тот еще месье, я тяготею к первым, но идеи языка self тем не менее тоже заинтересовали меня. Можно же наверно как-то выразить наши ДСЛи, которые мы делаем макросами с помощью элементарных объектных отношений без особой потери выразительности.

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

Ну как я и говорил: принцип наименьшего удивления нарушен.

Это ошибка в DrRacket. Без него не воспроизводится. В консоли (enter! «a.rkt») (require «b.rkt») работает

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

Ну ок. И как же мне организовать тестирование теперь. Короче нужна возможность создавать модуль моего языка внутри выражения обычного ракета, вытаскивать результат выполнения его разбора (top level expressions) и сверять с эталоном. Пока что единственная возможность тетстирования заключается в том, чтоб вынести ДСЛ код в отдельный файл и сделать ему require и то не факт, что получится из одного тестового модуля сделать require на 2 разных ДСЛ модуля так, чтоб получить их результаты отдельно. В общем мне нужен #lang внутри сорца. Что-то подобное вроде как умеет scribble делать, но я не понимаю, с какого конца к нему подступиться.

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

И еще вопрос, как кошерно писать #%module-begin? Ну чтоб все define выполнились в топ лвл, а все expr ушли кудато ко мне (ну или осели в переменной модуля). Как различать формы уровня модуля? Проверкой на слово define в начале как-то тупо.

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

чтоб вынести ДСЛ код в отдельный файл и сделать ему require

Делай require из пустого окна DrRacket. Тогда работает.

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

Проверкой на слово define в начале как-то тупо.

Но реально так. Только сравнивать надо через free-identifier=? и сначала делать частичное раскрытие макросов до define.

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

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

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

Тема в трекере всплывает, заходишь, а тут всё те же и о том же.

Думаешь тема ещё будет использоваться «по назначению»? Если мешает, то можно отписаться ведь. Мне вот интересно почитать.

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

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

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

Делай require из пустого окна DrRacket

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

и сначала делать частичное раскрытие макросов до define.

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

И вообще, до 7 страниц доползли, так что го в приват, незачем народ нервировать странным топом лора. Например моё мыло NamorNimus@gmail.com

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

Да, небезынтересно. Но я думаю, что увлекаться личной перепиской не стоит. Хотя, если модераторы не видят ничего предосудительного, то всё ок, это только мое личное мнение.

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

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

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