在Chicken Scheme中使用vs Import vs Require vs Require-extension

时间:2016-08-12 18:36:12

标签: scheme chicken-scheme

我对鸡的(use)(import)之间的差异有些模糊。同样,(load)(require)(require-extension)有何不同?

网站上似乎没有提到这些事情。

1 个答案:

答案 0 :(得分:13)

Loadrequire是纯粹的运行时程序操作。 Load接受一个字符串参数,并将具有该名称的文件(可以是源代码或编译代码)加载到正在运行的Scheme中,以便它定义的任何内容都可用。 Require执行相同的操作,但通过查看是否已使用相同名称调用provide来检查文件是否已加载(通常由加载时的文件调用)。它们在Scheme编程中相对较少,对应于其他语言的插件,其中编译时未知的代码需要加载。有关详细信息,请参阅单元eval的手册页。

Import关注的是模块而不是文件。它查找必须已加载的命名模块(但参见下面的Chicken 5),并使从该模块导出的名称在当前上下文中可见。为了成功导入模块,必须有一个导入库。它是语法,因此模块名称必须在调用中显式出现,并且无法在运行时计算。有关详细信息,请参阅模块的手册页。

Require-library做正确的事来加载代码。如果代码已经是正在运行的Scheme的一部分,要么是因为它内置于Chicken,它什么都不做。否则,它将加载核心库单元(如果有),或者将require作为最后的手段。在编译时,它会做类似的事情以确保在运行时环境是正确的。请参阅"非标准宏和特殊表格"有关详细信息,请参阅手册中的页面。

Use执行require-library后跟import同名。这是为Chicken程序添加功能的最常用方法。但是,我们编写(import scheme)(import chicken)因为已经加载了这些模块的功能。 Require-extensionuse的完全同义词,为SRFI 55兼容性提供。在R7RS模式下,import也是use的同义词。

鸡5的更新

Use已从该语言中删除,import现在执行use以前执行的操作:加载(如果需要)然后导入。因此,Require-extension现在是import的同义词。

此外,特定于鸡的程序和宏已被分解为名为(chicken base)(chicken bitwise)的模块。