2024 Clojure状态调查!中分享您的想法。

欢迎!有关如何使用本页面的更多信息,请参阅关于页面。

–2
语法和读取器

如何将以下代码转换为C语言?

one
(defn f [x]
(cond

(>= x 0) "X é positivo"
(< x 0) "X é negativo"
))

two
(defn f [x]
(if (== x 0)

(do (println "Zero") true)
(do (println "Outro valor") false)))

three
(defn f

([numbers] (f 0 numbers))
([total numbers]
    (if (empty? numbers)
        total
        (f (+ (first numbers) total) (rest numbers)))))

1 个答案

+1

我将使用函数名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);
    }
}
我的朋友,感谢您的回复,但这行代码无法编译。
我对Clojure语言一无所知,我必须用C语言编写这个代码,如果有人可以帮助我,我将不胜感激。
如果你需要用C语言编写,那么你对C语言的了解程度如何?例如,你有没有在C语言中使用过链表,并遍历链表?如果有,那么你应该能够对上面第3个代码片段做些小的修改,使其像C语言的链表那样工作。

如果你没有在C语言中用过链表,那么我建议你先学习如何做,这并不真的是关于Clojure的问题。
...