Racket 中的原语和内置函数

Primitives and built-in functions in Racket

原语和内置函数在Racket中是一回事吗? 如果不是,它们之间有什么区别?

简短的回答是

原始函数是那些不在其自己的运行时中实现但由运行时固有地实现的函数。例如。 cons 是用 C 实现的,racket VM 带有实现它的代码。 list* 也是,但它并不真的需要是原始的。有些原语只是为了加快速度。

内置函数仅意味着它们随语言一起提供。这些都是原语和所有在语言本身中实现并随实现一起提供的标准库。一个例子是 make-list。如果你右击 IDE 并选择 "Open defining file" 你会看到它在 racket 中的实现:

(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 中的许多包。