История изменений
Исправление 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 типизированные функции? Так для этого всё равно придётся явно написать ту же проверку, которая есть неявно в контракте. А если она просто есть ещё раз явно, компилятор всё равно выкинет.