我真的不喜欢 LISP,我很想将所有旧的 lisp 代码转换为 c。我是一个 C 初学者,甚至是 lisp 的初学者。
问问题
3393 次
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 回答