确定以编程方式定义哪些功能

时间:2020-07-25 07:44:37

标签: racket

我想将对特定功能集的调用替换为我的实现,例如:

(define (call-my-fn f . args)
  (cond [(eq? f append) (apply my-append args)]))

我所有的实现都在单独的文件中,并且我不想继续添加到cond子句中。有没有办法我可以这样写:

(require "my-fns.rkt")
(define (call-my-fn f . args)
  (cond [(is-defined? f "my-fns.rkt") (apply "my-version-of-f" args)]))

1 个答案:

答案 0 :(得分:4)

dynamic-require可用于动态查询其他模块中提供的变量。 numpy的第三个参数控制当查询的变量不存在时应该发生什么,因此您可以执行以下操作:

Keras
dynamic-require

您可能会尝试将以上内容简化为

;; lib.rkt

#lang racket

(provide foo bar)
(define foo #f)
(define (bar x) x)

如果您知道所有提供的标识符未绑定到;; client.rkt #lang racket (define does-not-exist (gensym)) (eq? (dynamic-require "lib.rkt" 'foo (λ () does-not-exist)) does-not-exist) ; #t (eq? (dynamic-require "lib.rkt" 'bar (λ () does-not-exist)) does-not-exist) ; #t (eq? (dynamic-require "lib.rkt" 'baz (λ () does-not-exist)) does-not-exist) ; #f ,则此方法有效。但是,如果不是这种情况,则会产生不正确的结果,如上所示。该解决方案通过返回一个唯一的;; client.rkt #lang racket (dynamic-require "lib.rkt" 'foo (λ () #f)) ; #f (dynamic-require "lib.rkt" 'bar (λ () #f)) ; #<procedure:bar> (dynamic-require "lib.rkt" 'baz (λ () #f)) ; #f 唯一符号#f来解决该问题。然后,我们可以使用does-not-exist来测试返回的值是否为eq?。如果是这样,那么我们可以确定没有提供标识符。

相关问题