gpt4 book ai didi

import - 在 Racket 中需要 vs 加载 vs 包含 vs 导入

转载 作者:行者123 更新时间:2023-12-03 13:33:21 24 4
gpt4 key购买 nike

Racket 文档表明 Racket 有单独的形式: require , load , include , 和 import .许多其他语言只包含其中一种,并且通常作为同义词使用(尽管显然存在语言特定的差异,例如 C 中的 #include 和 Java 中的 import)。

由于 Racket 拥有所有这四个,每个之间有什么区别,我一般应该使用哪个?此外,如果每个都有特定用途,我应该什么时候使用替代类型?另外,this question似乎表明 require (与 provide 配对)是首选,为什么?

最佳答案

1. 要求
你是对的,你想要的默认值几乎总是 require (与 provide 配对)。这两种形式与Racket的 modules 齐头并进并允许您更轻松地确定哪些变量应在哪些文件中作用域。例如,以下文件定义了三个变量,但只导出了 2 个。

#lang racket   ; a.rkt
(provide b c)
(define a 1)
(define b 2)
(define c 3)
根据 the Racket style guide , 理想情况下,提供应该是文件中 #lang 之后的第一个表单。这样您就可以轻松判断模块提供了什么。在少数情况下这是不可能的,但在您开始制作您自己打算公开分发的 Racket 库之前,您可能不会遇到这些情况。就个人而言,我还是放了一个文件的 require在其 provide 之前,但我有时会为此感到沮丧。
在 repl 或其他模块中,您现在可以 require 这个文件并查看它提供的变量。
Welcome to Racket v6.12.
> (require "a.rkt")
> c
3
> b
2
> a
; a: undefined;
; cannot reference undefined identifier
; [,bt for context]
ways to get around this ,但这可以作为模块传达其显式导出内容的一种方式。
2.加载
这是 require 的一个更动态的变体。一般来说,你不应该使用它,而是使用 dynamic-require 当您需要动态加载模块时。在这种情况下, load实际上是 require 的原语在幕后使用。但是,如果您明确希望模拟顶层(需要明确的是,您几乎从不这样做),那么 load 是一个不错的选择。尽管在这些极少数情况下,我仍会将您转至 racket/load 。语言。它的交互就像每个表单直接输入到 repl 中一样。
#lang racket/load
(define x 5)
(displayln x) ; => prints 5
(define x 6)
(displayln x) ; => prints 6
3. 包括
包含类似于 #include在 C 中。您应该使用它的情况更少。 include form 抓取给定路径的 s-expression 语法,并将其直接放在文件中 include 所在的文件中。形式是。起初,这可能是一个很好的解决方案,允许您将单个模块拆分为多个文件,或者将一个模块“片段”放入多个文件中。然而,有更好的方法可以在不使用 include 的情况下完成这两件事。 ,这也不会带来您使用 include 获得的令人困惑的副作用。1 如果您仍然坚持使用 import,请记住一件事,是您正在导入的文件可能不应该有 #lang行,除非您明确想要嵌入子模块。 (在这种情况下,除了 require 之外,您还需要有一个 include 表格)。
4. 进口
最后, import实际上不是 Racket 的核心部分,而是它的 unit system 的一部分.单元在某些方面与模块相似,但允许循环依赖(单元 A 可以依赖于单元 B,而单元 B 依赖于单元 A)。近年来,由于它们的语法开销,它们已经失宠。
也不同于其他形式 import (还有 export ),取 signatures ,并依赖于外部 linker决定哪些实际单元应该链接在一起。单元本身就是一个复杂的话题,应该有自己的问题来解决如何创建和链接它们。
结论 (tldr)
TLDR;使用 requireprovide .它们是最好的支持和最容易理解的。其他形式确实有它们的用途,但应该只考虑“高级用途”。
1这些副作用与您对 #include 的预期相同。在 C 中。例如顺序很重要,并且表达式以非常不可预测的方式混合在一起。

关于import - 在 Racket 中需要 vs 加载 vs 包含 vs 导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48548687/

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