如何将LISP代码翻译或转换为C代码?

时间:2012-08-12 00:39:34

标签: c lisp

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

2 个答案:

答案 0 :(得分:4)

这两种语言非常不同。 Lisp依赖于大量机器的存在:

  • 解析和评估Lisp代码的代码
  • 具有特定语义的标准列表数据结构
  • 垃圾收集器
当然,C和C都没有。当您将所有这些内容收集在一起并在C中提供时,您将拥有一个复杂,难以理解的编程环境。只学习Lisp会容易得多!

答案 1 :(得分:1)

这是我转换成C的一些LISP.LISP来自'Calendrical Calculations',转换在很久以前完成,来自本书的“千禧版”(现在有第三版)换句话说,所以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中的内存管理变得......有趣(辛勤工作,有问题)。