首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从C调用球拍函数

从C调用球拍函数
EN

Stack Overflow用户
提问于 2016-03-29 14:14:19
回答 1查看 911关注 0票数 12

我有一个球拍模块hw.rkt:

代码语言:javascript
复制
#lang racket/base

(provide hw)

(define (hw) (displayln "Hello, world!"))

我想编写一个C程序,嵌入Racket运行时并应用过程(hw)

有一个示例代码这里,它演示了如何嵌入Racket运行时并应用在racket/base中的过程,或者读取和评估S-表达式,但我没有幸运地修改该代码以允许访问(hw)过程。

此页似乎说,通过首先使用raco ctool --c-mods将hw.rkt编译到hw.c可以完成我想做的事情,而且当我尝试它时工作得很好,但我仍然不能真正访问(hw)过程。

如果有人可以发布一个完整的示例程序,或者简单地描述使用哪个C函数,我会非常感激的。从那里我可以找出剩下的。

编辑,以提供我尝试过的东西的示例。

我修改了示例程序,去掉了“计算命令行参数”位,直接跳到REPL,这样我就可以进行实验了。因此(运行raco ctool --c-mods hw.c ++libs racket/base hw.rkt的结果是"hw.c“):

代码语言:javascript
复制
#define MZ_PRECISE_GC
#include "scheme.h"

#include "hw.c"

static int run(Scheme_Env *e, int argc, char *argv[])
{
  Scheme_Object *curout = NULL, *v = NULL, *a[2] = {NULL, NULL};
  Scheme_Config *config = NULL;
  int i;
  mz_jmp_buf * volatile save = NULL, fresh;

  MZ_GC_DECL_REG(8);
  MZ_GC_VAR_IN_REG(0, e);
  MZ_GC_VAR_IN_REG(1, curout);
  MZ_GC_VAR_IN_REG(2, save);
  MZ_GC_VAR_IN_REG(3, config);
  MZ_GC_VAR_IN_REG(4, v);
  MZ_GC_ARRAY_VAR_IN_REG(5, a, 2);

  MZ_GC_REG();

  declare_modules(e);

  v = scheme_intern_symbol("racket/base");
  scheme_namespace_require(v);

  config = scheme_current_config();
  curout = scheme_get_param(config, MZCONFIG_OUTPUT_PORT);

  save = scheme_current_thread->error_buf;
  scheme_current_thread->error_buf = &fresh;
  if (scheme_setjmp(scheme_error_buf)) {
    scheme_current_thread->error_buf = save;
    return -1; /* There was an error */
  } else {
    /* read-eval-print loop, uses initial Scheme_Env: */
    a[0] = scheme_intern_symbol("racket/base");
    a[1] = scheme_intern_symbol("read-eval-print-loop");
    v = scheme_dynamic_require(2, a);
    scheme_apply(v, 0, NULL);
    scheme_current_thread->error_buf = save;
  }

  MZ_GC_UNREG();

  return 0;
}

int main(int argc, char *argv[])
{
  return scheme_main_setup(1, run, argc, argv);
}

不能工作的东西(以及它们的错误消息):

从REPL中调用(hw)

代码语言:javascript
复制
hw: undefined:
 cannot reference undefined identifier
  context...:
   /usr/local/share/racket/collects/racket/private/misc.rkt:87:7

((dynamic-require 'hw 'hw))

代码语言:javascript
复制
standard-module-name-resolver: collection not found
  for module path: hw
  collection: "hw"
  in collection directories:
  context...:
   show-collection-err
   standard-module-name-resolver
   /usr/local/share/racket/collects/racket/private/misc.rkt:87:7

((dynamic-require "hw.rkt" 'hw))

代码语言:javascript
复制
standard-module-name-resolver: collection not found
  for module path: racket/base/lang/reader
  collection: "racket/base/lang"
  in collection directories:
  context...:
   show-collection-err
   standard-module-name-resolver
   standard-module-name-resolver
   /usr/local/share/racket/collects/racket/private/misc.rkt:87:7

编辑示例代码

代码语言:javascript
复制
v = scheme_intern_symbol("racket/base");
scheme_namespace_require(v);
v = scheme_intern_symbol("hw");
scheme_namespace_require(v);

错误:

代码语言:javascript
复制
standard-module-name-resolver: collection not found
  for module path: hw
  collection: "hw"
  in collection directories:
  context...:
   show-collection-err
   standard-module-name-resolver
SIGSEGV MAPERR sicode 1 fault on addr 0xd0
Aborted

(分段错误可能是因为我在尝试scheme_namespace_require之前没有检查'v‘的值。)

编辑示例代码mk。2个

代码语言:javascript
复制
v = scheme_intern_symbol("racket/base");
scheme_namespace_require(v);
v = scheme_intern_symbol("hw.rkt");
scheme_namespace_require(v);

错误:

代码语言:javascript
复制
hw.rkt: bad module path
  in: hw.rkt
  context...:
   standard-module-name-resolver
SIGSEGV MAPERR sicode 1 fault on addr 0xd0
Aborted

(再:分段错误:如上所示)

编辑示例代码mk。3个

代码语言:javascript
复制
v = scheme_intern_symbol("racket/base");
scheme_namespace_require(v);
v = scheme_intern_symbol("./hw.rkt");
scheme_namespace_require(v);

(如上)

编辑示例代码mk。4

代码语言:javascript
复制
/* read-eval-print-loop, uses initial Scheme_Env: */
a[0] = scheme_intern_symbol("hw");
a[1] = scheme_intern_symbol("hw");
v = scheme_dynamic_require(2, a);

(作为mk。1,保存分段故障)

编辑示例代码mk。5

代码语言:javascript
复制
/* read-eval-print loop, uses initial Scheme_Env: */
a[0] = scheme_intern_symbol("hw");
a[1] = scheme_eval(a[0], e);
scheme_apply(a[1], 0, NULL);

错误:

代码语言:javascript
复制
hw: undefined;
 cannot reference undefined identifier
EN

回答 1

Stack Overflow用户

发布于 2016-03-31 13:02:46

马修弗拉特这里回答。在使用dynamic-require时,我需要两次引用模块的名称,而不是一次。感谢Flatt医生的帮助。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36286921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档