我将使用函数名f1、f2和f3调用C代码,顺序与你在问题中给出的三个Clojure函数相同。我尚未尝试编译和运行这些代码,但它们应该很接近,因为我相当熟悉C语言。
char *f1 (long x)
{
if (x >= 0) {
return "X é positivo";
} else if (x < 0) {
return "X é negativo";
}
}
行为上的一个可能差异是返回的字符串至少按ASCII编码,而不是Clojure的UTF-16编码。另外,我也不确定f1返回的字符串是否可变。
bool f2(long x)
{
if (x == 0) {
printf("Zero\n");
return TRUE;
} else {
printf("Outro valor\n");
return FALSE;
}
}
对于f3,我知道在C语言中,可以使用名为varargs的库编写接受可变数量参数的C函数,但这有点麻烦,并且我没有精确地记住如何使用它。我将编写一个始终接受两个参数的C函数,从而实现了Clojure函数的二元版本,但不是单参数版本。
此外,在C语言中还有许多表示事物列表的细微差异,遍历列表的C代码取决于这些表示的精确方式。我将对其中一种方式做出选择,其中每个元素都是一个包含一个数字和指向列表中下一个struct的下一个指针的结构实例。
typedef struct list_elem {
long number;
list_elem_t *next;
} list_elem_t;
long f3(long total, list_elem_t *lst)
{
if (lst == NULL) {
return total;
} else {
return f3(lst->number + total, lst->next);
}
}