私は LISP が本当に好きではなく、古い Lisp コードをすべて c に変換したいと思っています。私は初心者の C コーダーであり、Lisp の初心者でもあります。
3393 次
2 に答える
4
2 つの言語は非常に異なります。Lisp は多くの機械の存在に依存しています:
- Lisp コードを解析して評価するためのコード
- 特定のセマンティクスを持つ標準リスト データ構造
- ガベージコレクター
もちろん、Cにはこれらの機能はありません。これらすべてをまとめて C で使用できるようにすると、複雑で理解しにくいプログラミング環境になります。Lisp を学ぶだけの方がはるかに簡単です。
于 2012-08-12T00:46:23.717 に答える
1
これは私が C に変換した LISP の一部です。LISP は'Calendrical Calculations'からのものであり、変換は本の 'Millenium Edition' からのものであるのに十分前に行われました (代わりに入手できる第 3 版があります)。 )、したがって、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 に答える