2016-11-24 22 views

答えて

3

短い答えはで、です!

プリミティブ関数は、それ自身のランタイムでは実装されていないが、ランタイムによって本質的に実装されているものです。例えば。 consはC言語で実装されており、ラケットVMには実装されているコードが付属しています。 list*でも、実際にはプリミティブである必要はありませんでした。いくつかのプリミティブは物事をスピードアップするだけのものです。

組み込み関数は、言語に付属していることを意味します。これらはすべてプリミティブであり、言語自体で実装され、実装に同梱されているすべての標準ライブラリです。例はmake-listです。あなたはrigth IDE内をクリックし、「開くファイルを定義する」を選択した場合、あなたはそれがラケットに実装だわかります

(define (make-list n x) 
    (unless (exact-nonnegative-integer? n) 
    (raise-argument-error 'make-list "exact-nonnegative-integer?" n)) 
    (let loop ([n n] [r '()]) 
    (if (zero? n) r (loop (sub1 n) (cons x r))))) 

プリミティブもpkgs.racket-lang.orgにパッケージの多くになり内蔵でもない関数の例を。

+0

'make-list'はネイティブコードにJITされませんか?その後、組み込みのものと区別するために、どのような用途がありますか?内部ブートストラップには便利だと思います.Racketの特定のコードは、他のものがロードされるまで、プリミティブに依存する可能性が高いです。 – Kaz

+0

@Kazプリミティブではない組み込み関数は、ほかのラケットコードよりもコンパイルされていません。 'make-list' **は組み込みですが、プリミティブではないので、ラケットVMによって実行されるバイトコードにコンパイルされます。プリミティブだけがネイティブ実装を持っています。 – Sylwester

関連する問題