Lisp 球拍中的原语和内置函数

Lisp 球拍中的原语和内置函数,lisp,racket,primitive,built-in,Lisp,Racket,Primitive,Built In,基本体和内置的函数在球拍中是一样的吗? 如果没有,它们之间有什么区别?简短的回答是没有 基元函数是那些不在自己的运行时中实现,但本质上由运行时实现的函数。例如,cons是用C实现的,racket VM附带了实现它的代码列表*也是,但它实际上不需要是原语。有些原语只是为了加快速度 内置函数只是意味着它们与语言一起出现。这些都是原语和所有标准库,都是用该语言本身实现的,并随实现一起提供。例如,制作列表。如果您右键单击IDE并选择“打开定义文件”,您将在racket中看到它的实现: (define (

基本体和内置的函数在球拍中是一样的吗?
如果没有,它们之间有什么区别?

简短的回答是没有

基元函数是那些不在自己的运行时中实现,但本质上由运行时实现的函数。例如,
cons
是用C实现的,racket VM附带了实现它的代码<代码>列表*也是,但它实际上不需要是原语。有些原语只是为了加快速度

内置函数只是意味着它们与语言一起出现。这些都是原语和所有标准库,都是用该语言本身实现的,并随实现一起提供。例如,
制作列表
。如果您右键单击IDE并选择“打开定义文件”,您将在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)))))

一个既不是原语也不是内置函数的例子是中的许多包。

生成列表
不会被JIT到本机代码吗?在那之后,把它和内置的东西区别开来有什么用呢?我认为它对内部引导很有用:Racket中的某些代码可能只能依赖于原语,直到加载其他东西为止。@Kaz非原语的内置代码编译起来并不比任何其他Racket代码都好<代码>生成列表
是内置的,但不是原语,因此它被编译为racket VM运行的字节码。只有原语具有本机实现。