我对鸡的(use)
和(import)
的区别有点模糊。同样,(load)
, (require)
和(require-extension)
有什么不同?
这些事情在网站上似乎没有被提及。
Load
和require
是纯粹的运行时过程操作。Load
接受一个字符串参数,并将具有该名称的文件(可以是源代码或编译后的代码)加载到正在运行的Scheme中,以便它定义的任何内容都可用。Require
做同样的事情,但是检查文件是否已经加载,通过查看provide
是否已经以相同的名称调用(通常是在加载时由文件调用)。它们在Scheme编程中相对较少,对应于其他语言中的插件,其中需要加载编译时未知的代码。有关详细信息,请参阅eval
单元的手册页。
Import
关注的是模块而不是文件。它查找已命名的模块,该模块必须已经加载(参见下面的Chicken 5),并使从该模块导出的名称在当前上下文中可见。为了成功导入模块,必须有一个模块的导入库。这是语法,因此模块名称必须显式地出现在调用中,并且不能在运行时计算。
Require-library
做正确的事情来加载代码。如果代码已经是正在运行的Scheme的一部分,或者因为它被内置于Chicken中,那么它什么也不做。否则,它将加载一个核心库单元(如果有的话),或者作为最后的手段调用require
。在编译时,它做类似的事情来确保环境在运行时是正确的。详细信息请参见手册中的"非标准宏和特殊表单"一页。
Use
在相同的名称上执行require-library
和import
。这是向Chicken程序添加功能的最常见方式。但是,我们编写(import scheme)
和(import chicken)
是因为这些模块的功能已经加载。Require-extension
是use
的同义词,是为了兼容SRFI 55而提供的。在R7RS模式下,import
也是use
的同义词。
更新鸡5
Use
已经从语言中删除,import
现在做use
过去做的事情:加载(如果需要)然后导入。因此,Require-extension
现在是import
的同义词。
此外,chicken特有的程序和宏被分解成模块,命名为(chicken base)
和(chicken bitwise)
。