LINUX.ORG.RU

История изменений

Исправление monk, (текущая версия) :

Не совсем понял, при чем тут контракты, мы вроде про статическую типизацию

У тебя

(: f (Integer -> Integer))
(define (f x) ...)

(define (g y) .... (f y) ...)

Так как f типизирован, компилятор внутри него может быть уверен, что x имеет тип Integer и нигде его не проверять. Так как g нетипизирован, любой вызов f из g должен проверять все типы переданных аргументов. Иначе будет UB.

какие-нибудь небезопасные варианты тоже нужны вроде «выполни как получится без всяких проверок или если не можешь вывести / чекнуть - просто выполни и упади если что».

Для UB уже C++ выше крыши. Если реально надо, чтобы быстро работало и ничего не проверяло, лучше на нём. А если очень надо без проверок, в Racket для этого отдельные функции: unsafe-car, unsafe-fx+ и прочее. А запустить нормальную функцию выкинув проверки не выйдет (хочешь, форкай и сам отвечай за код без проверок).

На сколько я помню у рекет весь модуль будет typed, что именно надо заворачивать, динамику?

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

Внутри define-untyped гипотетическом можно прописать декларации для отдельных выражений или у нас или-или (типизированный / нетпизированный модуль)?

А смысл от них, если внутри функции от них ничего не зависит? Запускать изнутри define-untyped типизированные функции? Так для этого всё равно придётся явно написать ту же проверку, которая есть неявно в контракте. А если она просто есть ещё раз явно, компилятор всё равно выкинет.

Исходная версия monk, :

Не совсем понял, при чем тут контракты, мы вроде про статическую типизацию

У тебя

(: f (Integer -> Integer))
(define (f x) ...)

(define (g y) .... (f y) ...)

Так как f типизирован, компилятор внутри него может быть уверен, что x имеет тип Integer и нигде его не проверять. Так как g нетипизирован, любой вызов f из g должен проверять все типы переданных аргументов. Иначе будет UB.

какие-нибудь небезопасные варианты тоже нужны вроде «выполни как получится без всяких проверок или если не можешь вывести / чекнуть - просто выполни и упади если что».

Для UB уже C++ выше крыше. Если реально надо, чтобы быстро работало и ничего не проверяло, лучше на нём. А если очень надо без проверок, в Racket для этого отдельные функции: unsafe-car, unsafe-fx+ и прочее. А запустить нормальную функцию выкинув проверки не выйдет (хочешь, форкай и сам отвечай за код без проверок).

На сколько я помню у рекет весь модуль будет typed, что именно надо заворачивать, динамику?

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

Внутри define-untyped гипотетическом можно прописать декларации для отдельных выражений или у нас или-или (типизированный / нетпизированный модуль)?

А смысл от них, если внутри функции от них ничего не зависит? Запускать изнутри define-untyped типизированные функции? Так для этого всё равно придётся явно написать ту же проверку, которая есть неявно в контракте. А если она просто есть ещё раз явно, компилятор всё равно выкинет.