GNU guile:向scm注册的函数\u c\u define\u gsubr:如何处理可选参数?

GNU guile:向scm注册的函数\u c\u define\u gsubr:如何处理可选参数?,c,optional-parameters,guile,C,Optional Parameters,Guile,我定义了一个guile C函数: static SCM myfun(SCM arg1,SCM opt_arg2) { return SCM_BOOL_T; } 注册于 scm_c_define_gsubr ("myfun", 1, 1, 0, myfun); 有一个可选的参数。如何检测是否使用了opt_arg2 在 或 guile用户邮件列表中回答了以下问题: 引用:亚历克斯·冯 从Guile手册“6.1 Guile API概述”中 对于某些Scheme函数,最后的一些参数是可选

我定义了一个guile C函数:

static SCM myfun(SCM arg1,SCM opt_arg2)
  {
  return SCM_BOOL_T;
  }
注册于

scm_c_define_gsubr ("myfun", 1, 1, 0, myfun);
有一个可选的参数。如何检测是否使用了
opt_arg2


guile用户邮件列表中回答了以下问题:

引用:亚历克斯·冯

从Guile手册“6.1 Guile API概述”中

对于某些Scheme函数,最后的一些参数是可选的;这个 相应的C函数必须始终与所有可选函数一起调用 指定的参数。取得效果,就好像一个论点没有被证明一样 指定,将“SCM_UNDEFINED”作为其值传递。你不能为我这样做 中间的争论;当一个参数为“SCM_UNDEFINED”时,所有 跟随它的也必须是“SCM_UNDEFINED”

因此,我们可以检查opt_arg2的值SCM_UNDEFINED,以便 决定我们是否收到了可选参数。代码在 附件:

#include <libguile.h>

static SCM myfun(SCM arg1,SCM opt_arg2)
{
  if (scm_is_eq (opt_arg2, SCM_UNDEFINED))
    scm_display(scm_from_utf8_string("Optional argument NOT received!\n"),
                scm_current_output_port());
  else
    scm_display(scm_from_utf8_string("Optional argument received!\n"),
                scm_current_output_port());
  return SCM_BOOL_T;
}

void
init_myfun(void)
{
  scm_c_define_gsubr("myfun", 1, 1, 0, myfun);
}
#包括
静态SCM myfun(SCM arg1、SCM opt_arg2)
{
if(scm_为_eq(opt_arg2,scm_未定义))
scm\U显示(scm\U来自\U utf8\U字符串(“未收到可选参数!\n”),
scm_当前_输出_端口());
其他的
scm\u显示(scm\u来自\u utf8\u字符串(“收到可选参数!\n”),
scm_当前_输出_端口());
返回SCM\u BOOL\T;
}
无效的
init_myfun(无效)
{
scm_c_define_gsubr(“myfun”,1,1,0,myfun);
}
更新:交叉张贴在
(myfun 1 2)
#include <libguile.h>

static SCM myfun(SCM arg1,SCM opt_arg2)
{
  if (scm_is_eq (opt_arg2, SCM_UNDEFINED))
    scm_display(scm_from_utf8_string("Optional argument NOT received!\n"),
                scm_current_output_port());
  else
    scm_display(scm_from_utf8_string("Optional argument received!\n"),
                scm_current_output_port());
  return SCM_BOOL_T;
}

void
init_myfun(void)
{
  scm_c_define_gsubr("myfun", 1, 1, 0, myfun);
}