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 结构体的实例。

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的问题。
...