gpt4 book ai didi

module - 动态-需要一个相对于 Racket 中当前模块路径的模块(或者如何在 Racket 中找到当前模块路径)

转载 作者:行者123 更新时间:2023-12-04 12:48:06 25 4
gpt4 key购买 nike

如果我想在运行时选择需要一个模块,我可以使用 [ dynamic-require ' 1 .如果我想要一个已经安装的包,这很有效,例如:

(dynamic-require 'racket/match 'match)

这将(如果我安装了 racket/match),需要 racket/match并评估为 match在那个库中绑定(bind)。

但是,当我需要一个本地的、未安装的模块时,我遇到了麻烦。假设我有一个名为 eat.rkt 的模块,它提供了一个功能: bite :
#lang racket ;; eat.rkt
(provide bite)
(define (bite) "Nom nom")

现在假设我们想要制作一个 lunch.rkt需要 eat.rkt 的模块, 并调用该函数。此外,假设我将它们放在同一目录中:
#lang racket ;; lunch.rkt
(require "eat.rkt")
(bite) ; => Nom Nom

这很好,因为我使用了静态要求,但是当我想做一个 dynamic-require 时,这会崩溃。 :
#lang racket ;; lunch2.rkt
(define bite (dynamic-require "eat.rkt" 'bite)
(bite) ; => Nom Nom

虽然这看起来没问题,但事实证明 dynamic-require 所需的模块根据模块的路径不需要,但在 current-directory .所以,如果我在定义模块的目录中运行程序,那很好,但如果我在另一个目录中,一切都会中断:
$ racket lunch2.rkt
"Nom Nom"
$ cd snacks/
$ racket ../lunch2.rkt
; default-load-handler: cannot open module file

显然我可以改变 current-directory如果我知道它在哪里,到这个模块的目录。但是如果我不知道这个模块的路径,有没有办法得到它?或者,更直接地说,是否可以 dynamic-require相对于要求的模块路径的模块?

最佳答案

define-runtime-path 表单定义了一个在运行时可用的路径并且独立于 current-directory .使用它来定义你想要动态需要的模块的路径,例如:

#lang racket
(require racket/runtime-path)
(define-runtime-path eat "eat.rkt")
(dynamic-require eat 'bite)

关于module - 动态-需要一个相对于 Racket 中当前模块路径的模块(或者如何在 Racket 中找到当前模块路径),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42632854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com