Lisp ecl_init_模块中的第一个参数做什么?

Lisp ecl_init_模块中的第一个参数做什么?,lisp,common-lisp,ecl,Lisp,Common Lisp,Ecl,根据ECL手册的某些部分,C程序中库(已由lisp编译)初始化的必要部分正在进行初始化,如下所示: ecl_init_module(NULL, init_func_for_library); 在提供的所有示例中,第一个参数为NULL 它还可以采取什么其他价值观,达到什么目的?当然,参数本身应该有一些意义 注意。在本手册的其他部分中,为执行初始化,建议使用read_VV。这是做什么的?检查,我们可以看到NULL绑定到名为block的变量;当它为NULL时,将使用默认的空codeblock: cl

根据ECL手册的某些部分,C程序中库(已由lisp编译)初始化的必要部分正在进行初始化,如下所示:

ecl_init_module(NULL, init_func_for_library);
在提供的所有示例中,第一个参数为NULL

它还可以采取什么其他价值观,达到什么目的?当然,参数本身应该有一些意义

注意。在本手册的其他部分中,为执行初始化,建议使用read_VV。这是做什么的?

检查,我们可以看到NULL绑定到名为
block的变量
;当它为
NULL
时,将使用默认的空
codeblock

cl_object
ecl_init_module(cl_object block, void (*entry_point)(cl_object))
{
    ...
    if (block == NULL)
      block = ecl_make_codeblock();
    ...
}
代码块看起来像某种上下文/环境结构:

cl_object
ecl_make_codeblock()
{
  cl_object block = ecl_alloc(t_codeblock);
  block = ecl_alloc_object(t_codeblock);
  block->cblock.self_destruct = 0;
  block->cblock.locked = 0;
  block->cblock.handle = NULL;
  block->cblock.data = NULL;
  block->cblock.data_size = 0;
  block->cblock.temp_data = NULL;
  block->cblock.temp_data_size = 0;
  block->cblock.data_text = NULL;
  block->cblock.next = ECL_NIL;
  block->cblock.name = ECL_NIL;
  block->cblock.links = ECL_NIL;
  block->cblock.cfuns_size = 0;
  block->cblock.cfuns = NULL;
  block->cblock.source = ECL_NIL;
  block->cblock.error = ECL_NIL;
  block->cblock.refs = ecl_make_fixnum(0);
  si_set_finalizer(block, ECL_T);
  return block;
}

我想在大多数情况下,传递
NULL
就足够了。假设您可以使用现有代码块调用
ecl_init_module
,以与另一个模块共享某个状态;如果不更好地理解解释器的工作原理,这是很危险的。

如果传递NULL,是否能够以某种方式获得调用创建的块对象?试着重复使用它,就像你所做的那样said@Srv19我不确定这是否可行,但如果我想共享代码块,我会自己调用ecl_make_codeblock,并为不同的模块重用相同的对象。