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

欢迎!请参阅关于页面以了解有关此工作的更多信息。

–2
语法和读取器

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

一个
(defn f [x]
(cond

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

两个
(defn f [x]
(if (== x 0)

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

三个
(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函数的顺序相同。我没有尝试编译和运行这些代码,但应该相当接近,因为我 quite a bit 使用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结构体实例。

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无关。
...