ecl_init_module 中的第一个参数是做什么的?
What does first parameter in ecl_init_module do?
根据ECL手册的某些部分,C程序中的库(已由lisp编译)初始化的必要部分正在执行其初始化为:
ecl_init_module(NULL, init_func_for_library);
在所有提供的示例中,第一个参数为 NULL。
它还可以采取哪些其他价值观以及达到什么目的?当然这个参数本身应该是有一定意义的。
注意。在手册的其他部分,为了执行初始化,建议使用 read_VV 代替。那有什么作用?
检查 source code,我们可以看到 NULL 绑定到名为 block
的变量;当它是 NULL
时,将使用默认的空 codeblock
:
cl_object
ecl_init_module(cl_object block, void (*entry_point)(cl_object))
{
...
if (block == NULL)
block = ecl_make_codeblock();
...
}
代码块看起来像某种context/environment结构:
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
以与另一个模块共享某个状态;如果不更好地了解解释器的工作原理,这是有风险的。
根据ECL手册的某些部分,C程序中的库(已由lisp编译)初始化的必要部分正在执行其初始化为:
ecl_init_module(NULL, init_func_for_library);
在所有提供的示例中,第一个参数为 NULL。
它还可以采取哪些其他价值观以及达到什么目的?当然这个参数本身应该是有一定意义的。
注意。在手册的其他部分,为了执行初始化,建议使用 read_VV 代替。那有什么作用?
检查 source code,我们可以看到 NULL 绑定到名为 block
的变量;当它是 NULL
时,将使用默认的空 codeblock
:
cl_object
ecl_init_module(cl_object block, void (*entry_point)(cl_object))
{
...
if (block == NULL)
block = ecl_make_codeblock();
...
}
代码块看起来像某种context/environment结构:
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
以与另一个模块共享某个状态;如果不更好地了解解释器的工作原理,这是有风险的。