Я подозреваю, что это будет выглядеть примерно так:
#lang racket/load
(module m racket
(provide/contract [foo (-> (-> any/c))])
(define (foo)
(+ 10 3) ; do something
(lambda ()
(+ 40 2) ; do other things
)))
(module n racket
(require 'm)
((foo)))
(require 'n)
(-> (-> any/c))
- это контракт, который соответствует функциям, которые возвращают другую функцию, которая при оценке возвращает одно целочисленное значение.
Но если вы хотите уменьшить возвращаемые значения до foo
, вы бы использовали any
вместо any/c
, что допускает любое количество возвращаемых значений, а не только одно значение.Рассмотрим:
(module m racket
(provide/contract [foo (-> (-> any))])
(define (foo)
(+ 10 3) ; do something
(lambda ()
(values (+ 40 2) 666); do other things
)))
См. Контракты на функции высшего порядка в документации по Racket.