Применение приведения к динамически требуемой функции в набранной ракетке - PullRequest
5 голосов
/ 24 марта 2019

Я пытаюсь загрузить и использовать функцию из другого модуля во время выполнения.Проблема в том, что диапазон dynamic-require, Any, не может выглядеть как cast для более определенного (функционального) типа.

test.rkt:

#lang typed/racket

(module other-module typed/racket
  (provide f)
  (: f : Integer -> Integer)
  (define (f x)
    (* x 2)))

; g has type Any because dynamic-require returns a value of type Any
(define g (dynamic-require '(submod "test.rkt" other-module) 'f))

;contract violation
;  Attempted to use a higher-order value passed as `Any` in untyped code: #<procedure:f>
;  in: Any
;  contract from: typed-world
;  blaming: cast
;   (assuming the contract is correct)
((cast g (-> Integer Integer)) 3)

Есть ли способ загрузить и использовать функцию во время выполнения из другого модуля в #lang typed/racket?

1 Ответ

2 голосов
/ 25 мая 2019

Обходной путь - выполнить загрузку в нетипизированном модуле и использовать require/typed для назначения типов:

#lang typed/racket

(module other-module typed/racket
  (provide f)
  (: f : Integer -> Integer)
  (define (f x)
    (* x 2)))

(module another-module racket
  (define g (dynamic-require '(submod "test.rkt" other-module) 'f))
  (provide g))

(require/typed 'another-module
  (g (-> Integer Integer)))

(g 3)
;; 6

Но да, было бы лучше, если бы dynamic-require мог принять целевой типили Типизированная ракетка допускает нетипизированные регионы (противоположность with-type).

...