我将按照您的三个 Clojure 函数在问题中给出的顺序调用 C 代码中的函数名 f1、f2 和 f3。我尚未尝试编译和运行这些代码,但它们应该相当接近,因为我很熟悉 C 语言。
char *f1 (long x)
{
if (x >= 0) {
return "X é positivo";
} else if (x < 0) {
return "X é negativo";
}
}
行为上可能的一个差异是,返回的字符串是至少以默认 C 编译器选项的 ASCII 编码,而不是 Clojure 的 UTF-16 编码的 Unicode。此外,我不确定 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 函数的 2 参数版本,但不实现 1 参数版本。
还有许多的方式可以用来在 C 语言中表示事物的列表,C 语言遍历列表的代码取决于如何精确地表示这些事物。我将选择一种方法,其中每个元素都是一个包含一个数字和一个指向列表中下一个结构的指针的 C 结构体的实例。
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);
}
}