2

我真的不喜欢 LISP,我很想将所有旧的 lisp 代码转换为 c。我是一个 C 初学者,甚至是 lisp 的初学者。

4

2 回答 2

4

两种语言截然不同。Lisp 依赖于大量机器的存在:

  • 解析和评估 Lisp 代码的代码
  • 具有特定语义的标准列表数据结构
  • 垃圾收集器

当然,C 没有这些东西。当您将所有这些东西收集在一起并在 C 中提供它们时,您将拥有一个复杂的、难以理解的编程环境。学习 Lisp 会容易得多!

于 2012-08-12T00:46:23.717 回答
1

这是我转换成 C 的一些 LISP。LISP 来自“日历计算”,并且转换是在很久以前完成的,可以来自本书的“千年版”(现在有一个第三版,你会得到它),因此 C 中的所有名称都以“CCME”或“ccme”为前缀。

/*
Gregorian year corresponding to the fixed $date$.

Original LISP code
(defun alt-gregorian-year-from-fixed (date)
  ;; TYPE fixed-date -> gregorian-year
  (let* ((approx ; approximate year
          (quotient (- date gregorian-epoch -2)
                    146097/400))
         (start  ; start of next year
          (+ gregorian-epoch
             (* 365 approx)
             (quotient approx 4)
             (- (quotient approx 100))
             (quotient approx 400))))
    (if (< date start)
        approx
      (1+ approx))))

*/

CCME_GregorianYear ccme_alt_gregorian_year_from_fixed(CCME_FixedDate date)
{
        CCME_GregorianYear rv;
        /*S-CODE*/
        CCME_GregorianYear approx = ccme_quotient(date - ccme_gregorian_epoch() + 2, 146097.0/400.0);
        CCME_GregorianYear start = ccme_gregorian_epoch() + (365 * approx) +
                     ccme_quotient(approx, 4) -
                     ccme_quotient(approx, 100) +
                     ccme_quotient(approx, 400);

        if  (date < start)
                rv = approx;
        else
                rv = approx + 1;
        /*E-CODE*/
        return rv;
}

然而,这不是典型的 LISP(也不是特别典型的 C),将 LISP 转换为 C 的一般转换绝不是微不足道的。当您处理字符串和列表(尤其是字符串列表)时,这将是双重事实,因为 C 中的内存管理变得……有趣(努力工作,有问题)。

于 2012-08-12T00:46:04.770 回答