1
プリミティブとビルトイン関数はRacketで同じものですか? もしそうでなければ、それらの違いは何ですか?Racketのプリミティブと組み込み関数
プリミティブとビルトイン関数はRacketで同じものですか? もしそうでなければ、それらの違いは何ですか?Racketのプリミティブと組み込み関数
短い答えはで、です!
プリミティブ関数は、それ自身のランタイムでは実装されていないが、ランタイムによって本質的に実装されているものです。例えば。 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にパッケージの多くになり内蔵でもない関数の例を。
'make-list'はネイティブコードにJITされませんか?その後、組み込みのものと区別するために、どのような用途がありますか?内部ブートストラップには便利だと思います.Racketの特定のコードは、他のものがロードされるまで、プリミティブに依存する可能性が高いです。 – Kaz
@Kazプリミティブではない組み込み関数は、ほかのラケットコードよりもコンパイルされていません。 'make-list' **は組み込みですが、プリミティブではないので、ラケットVMによって実行されるバイトコードにコンパイルされます。プリミティブだけがネイティブ実装を持っています。 – Sylwester