请在 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

我将使用与您问题中给出的三个 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 结构的实例,该结构包含一个数字和一个指向列表中下一个结构指针的 next 指针。

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语言代码,并且遍历过这些链表?如果有,那么你应该能够对上面第三个代码片段进行一些小的修改,使其像C语言链表一样工作。

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