c - 使用 GNU guile 过滤 C 结构

标签 c scheme guile

我是计划/诡计的新手。我想使用用户的 scm 脚本过滤 C 程序内的 C 结构数组。像这样的东西:

struct Date {
    int year;
    int month;
    int day;
    };

struct Person {
    char name[20];
    Date birth;
    Date death;
    };

void printPersons(Person* persons, size_t n_persons, const char* scm_file) {
    size_t i;

    /* (...) compile script */

    for(i=0; i< n_persons;++i)
        {
        int accept = /** call guile script with &persons[i] */
        if( accept) printf("%s\n",persons[i].name);
        }
    /* dispose script */
    } 

现在我迷失在手册中了。我应该从哪里开始?谢谢。

最佳答案

要在 C 程序中调用方案脚本以使用 guile 进行评估,您需要使用 scm_with_guile()。然后,由 scm_with_guile() 执行的函数需要调用 scm_c_eval_string() (以方案语法计算字符串)或 scm_c_primitive_load() (以方案语法计算文件)之类的函数。这些字符串和文件本身可以使用正常的方案语法调用 guile load 和 use-modules 过程。

如果您碰巧使用 C++,这可能会给您一些想法:c++-gtk-utils/extensionextension source code 。对于您的特定代码,您可以使用使用 Cgu::Extension::integer_to_long() 转换器调用的 Cgu::Extension::exec_shared() 的返回值来初始化“accept”变量,但由于“accept”是int 类型,在 64 位系统上,您需要允许 long 到 int 溢出。您还需要将 person 结构解构为脚本的单独值。

关于c - 使用 GNU guile 过滤 C 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34725194/

相关文章:

scheme - 如何在 Guile 中使用 SRFI-1?

CUDA:是否保证合并对全局内存的连续字节的半扭曲访问?

c++ - C 和 C++ 关于++ 运算符的区别

c++ - 为什么内存管理很重要?

c++ - Racket/Scheme C++ 扩展和继承

functional-programming - 用于查找给定函数的列表的最小元素的 Racket 函数

c - movsd 从内存到 c x86-64 jit 中的 xmm0

data-structures - `set-car!` 的 `cdr` 也改变了 `car`,为什么?

c - Guile 程序错误 "procedure->pointer": Wrong Type Argument in Position 1

macros - 为什么这个 lisp 递归宏不起作用?