LINUX.ORG.RU

Вышел Racket 6.3

 , ,


2

9

Доступен для скачивания релиз 6.3 языка программирования Racket — http://racket-lang.org/.

Новшества:

  • При раскрытии макросов используется новое представление связывания, что позволяет проще понимать как макросы сохраняют связывания, особенно при вовлечении в процесс раскрытия нескольких модулей и при отклонении от гигиены при раскрытии.
  • GUI-библиотека Racket теперь использует Gtk3+ по умолчанию.
  • Новое руководство по Redex.
  • Улучшена проверка синтаксических ошибок для Redex-паттернов.
  • Bluebox стали более агрессивными в плане отыскания имён для поиска в документации.
  • Подмодули теперь полностью поддерживаются в Typed Racket.
  • Библиотека typed/racket/unsafe предоставляет формы импорта/экспорта для обхода генерации контрактов.
  • Typed Racket предоставляет экспериментальную поддержку units (из racket/unit).
  • Экспериментальная форма define-new-subtype позволяет указывать тонкие различия, без которых типы считаются идентичными (аналог new type в Haskell).
  • Конструктор типов Promise изменился, нарушив обратную совместимость для устранения promise, созданных с помощью promise/name.
  • Пакеты unstable-* исключены из главного дистрибутива.
  • big-bang поддерживает режим display-mode, что позволяет т.н. «мировым» программам (интерактивным, графическим программам, состоящих из простых математических функций) занимать весь экран целиком.

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

anonymous

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

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

Вот, кстати, замечательный пример, где типы ограничивают реализацию:

Это скорее не «ограничение типов», а «ограничение ссылок». Безопасность и отсутствие GC - за это приходится платить. И в голове ничего держать как раз не надо: напишешь неправильно - получишь по рукам от компилятора.

Я уже не говорю о том, что ты вырвал упоминание языка из контекста.

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

Описание может как присутствовать так и отсутствовать независимо от вида типизации.

Если описания нет вообще, то такую функцию я при любом имени поостерёгся бы использовать. И в этом случае и информация о типе может отсутствовать.

И почему ты привёл описание не из (обычного, не типизированного) ракета

Потому что ракет на самом деле всегда типизированный. Либо статически (Typed), либо динамически (через контракты). Тот же sort в не типизированном ракете:

(sort lst         
    less-than?         
   [ #:key extract-key         
    #:cache-keys? cache-keys?])   →   list? 
 
  lst : list? 
  less-than? : (any/c any/c . -> . any/c) 
  extract-key : (any/c . -> . any/c) = (lambda (x) x) 
  cache-keys? : boolean? = #f 

Как видишь, сплошные типы.

символ, совпадающий с именем глобальной функции определённого типа

какие именно возможности это даёт

1. Литералы - списки функций: (mapcar (lambda (f) (f 5)) '(sin cos)). Без литерала пришлось бы конструировать список при каждом вызове или заводить константу.

2. Вызов функции по имени (mapcar (intern «SIN») '(1 2 3))

3. Возможно писать логику, привязанную к имени функции

(defun app (f x)
  (case f
    ((sin cos) "trigonometry")
    ((+ -) "arithmetic")
    (t (funcall f x)))

Особенно про сильное сужение

Оценка субъективна. Можно ещё вспомнить макросы. Которые являются функциями (Listof Any) -> (Listof Any) и в системе типов, например Haskell непредставимы.

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

И в этом случае и информация о типе может отсутствовать.

Это какой-то сильно особый случай. Если тип не void* или какой-нибудь Any (подобие динамической типизации), то какая-никакая информация всё-таки будет.

Потому что ракет на самом деле всегда типизированный. Либо статически (Typed), либо динамически (через контракты).

Постой, а разве лисп не динамически типизированный?

1. Литералы - списки функций: (mapcar (lambda (f) (f 5)) '(sin cos)). Без литерала пришлось бы конструировать список при каждом вызове или заводить константу.

Дык, это тянет максимум на оптимизацию, а не на «ограничение алгоритмов».

2. Вызов функции по имени (mapcar (intern «SIN») '(1 2 3))
3. Возможно писать логику, привязанную к имени функции

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

Можно ещё вспомнить макросы. Которые являются функциями (Listof Any) -> (Listof Any)

В других языках макросы могут работать иначе.

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

Если тип не void* или какой-нибудь Any (подобие динамической типизации), то какая-никакая информация всё-таки будет.

Я имею в виду ситуацию, когда REPL отсутствует или не даёт информации о типе функций.

Например, модули Turbo Pascal. Имена можно вытащить через strings, а использовать уже методом тыка глядя на ругань компилятора.

Постой, а разве лисп не динамически типизированный?

лисп — в смысле, Common Lisp? Язык — да.Но стандартная библиотека почти везде не требует строгих типов: nil является списком (для него работает cdr), вместо функции можно передавать дезигнатор, во многих местах можно передавать строку или символ.

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

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

Например, модули Turbo Pascal. Имена можно вытащить через strings, а использовать уже методом тыка глядя на ругань компилятора.

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

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

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

Не совсем. После того, как понимаешь что требуется указатель («Pointer expression expected »), дальше ошибка «Invalid typecast» на всё, что не подходит.

Соответственно можно, «угадать» тип «животное», а получить экземпляр «обезьяна» (typecast позволяет).

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

Не совсем. После того, как понимаешь что требуется указатель («Pointer expression expected »), дальше ошибка «Invalid typecast» на всё, что не подходит.

Ну это всё-таки вырожденные случаи.

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