首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C语言中的高阶函数

C语言中的高阶函数
EN

Stack Overflow用户
提问于 2010-03-29 11:20:27
回答 8查看 12.1K关注 0票数 19

有没有一种用C实现高阶函数的“合适”方法?

我最好奇的是像可移植性和语法正确性这样的东西,如果有不止一种方式,优点和缺点是什么。

编辑:我想知道如何创建高阶函数的原因是,我已经编写了一个系统,将PyObject列表(调用python脚本时得到的列表)转换为包含相同数据的C结构列表,但组织方式不依赖于python.h库。所以我的计划是有一个函数,它迭代pythonic列表,对列表中的每个项目调用一个函数,并将结果放在一个列表中,然后返回该列表。

这基本上就是我的计划:

代码语言:javascript
复制
typedef gpointer (converter_func_type)(PyObject *)

gpointer converter_function(PyObject *obj)
{
    // do som stuff and return a struct cast into a gpointer (which is a void *)
}

GList *pylist_to_clist(PyObject *obj, converter_func_type f)
{
   GList *some_glist;
   for each item in obj
   {
       some_glist = g_list_append(some_glist, f(item));
   }
   return some_glist;
}

void some_function_that_executes_a_python_script(void)
{
   PyObject *result = python stuff that returns a list;
   GList *clist = pylist_to_clist(result, converter_function);
}

为了澄清这个问题:我想知道如何在更安全和更正确的C中做到这一点,我真的想保持高阶函数的风格,但如果这是不赞成的,我非常欣赏其他方法来做到这一点。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-03-29 22:37:10

如果你热衷于用普通的C实现这一点,你需要记住包含一个选项,将一个上下文指针从函数器(高阶函数)的调用者传递给传入的函数。这使您可以模拟足够多的闭包,从而使事情变得非常容易。那个指针指向的..。当然,这取决于您,但是它应该是函数器API中的一个void* (或者它的许多别名之一,比如GLib中的gpointer或Tcl中的ClientData )。

编辑:使用/改编您的示例:

代码语言:javascript
复制
typedef gpointer (converter_func_type)(gpointer,PyObject *)

gpointer converter_function(gpointer context_ptr,PyObject *obj)
{
    int *number_of_calls_ptr = context_ptr;
    *number_of_calls_ptr++;
    // do som stuff and return a struct cast into a gpointer (which is a void *)
}

GList *pylist_to_clist(PyObject *obj, converter_func_type f, gpointer context_ptr)
{
   GList *some_glist;
   for each item in obj
   {
       some_glist = g_list_append(some_glist, f(context_ptr,item));
   }
   return some_glist;
}

void some_function_that_executes_a_python_script(void)
{
   int number_of_calls = 0;
   PyObject *result = python stuff that returns a list;
   GList *clist = pylist_to_clist(result, converter_function, &number_of_calls);
   // Now number_of_calls has how often converter_function was called...
}

这只是一个简单的例子,但它应该会给你指明方向。

票数 5
EN

Stack Overflow用户

发布于 2010-03-29 11:52:14

从技术上讲,高阶函数只是接受或返回函数的函数。所以像qsort这样的东西已经是高阶的了。

如果你的意思是更像函数式语言中的lambda函数(这是高阶函数真正有用的地方),那么这些函数就会变得相当困难,并且不能在当前的标准C中自然完成。苹果的blocks扩展是最佳候选者。它只适用于GCC (和LLVM的C编译器),但它们真的很有用。希望这样的东西能流行起来。下面是一些相关的资源:

  • Apple's documentation on the feature (引用了一些苹果特定的技术,也解决了Objective-C,但核心块的东西是它们对C)
  • Here's a good intro on blocks
  • Cocoa for Scientists' overview of C blocks

的扩展的一部分

票数 21
EN

Stack Overflow用户

发布于 2010-03-29 13:28:18

在C中实现高阶函数的一个大问题是,要做任何重要的事情,都需要闭包,闭包是函数指针,其中包含它们可以访问的局部变量的数据结构。由于闭包背后的整个思想是捕获局部变量并将这些变量与函数指针一起传递,因此如果没有编译器支持,就很难做到这一点。即使有编译器的支持,没有垃圾回收也很难做到,因为变量可能存在于它们的作用域之外,这使得很难确定何时释放它们。

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

https://stackoverflow.com/questions/2535631

复制
相关文章

相似问题

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