2

私は LISP が本当に好きではなく、古い Lisp コードをすべて c に変換したいと思っています。私は初心者の C コーダーであり、Lisp の初心者でもあります。

4

2 に答える 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 に答える