Common lisp Lisp%var命名约定

Common lisp Lisp%var命名约定,common-lisp,naming-conventions,Common Lisp,Naming Conventions,在我读的那一页里 foo的低级、快速、危险功能或特定于Lisp系统的实现 有人能用这些上下文的一个例子把这句话再翻译一遍吗 使用此功能: (defun add (x y) (+ x y)) 它做一般加法。它支持整数、浮点数、复数和比率作为参数—所有在Lisp中定义的数字类型 但是,如果您有: (defun add (x y) (declare (fixnum x y) (optimize speed (safety 0) (debug 0))) (the fixnum (+ x y

在我读的那一页里

foo的低级、快速、危险功能或特定于Lisp系统的实现

有人能用这些上下文的一个例子把这句话再翻译一遍吗

使用此功能:

(defun add (x y)
  (+ x y))
它做一般加法。它支持整数、浮点数、复数和比率作为参数—所有在Lisp中定义的数字类型

但是,如果您有:

(defun add (x y)
  (declare (fixnum x y) (optimize speed (safety 0) (debug 0)))
  (the fixnum (+ x y)))
这会告诉编译器优化函数以获得适合汇编寄存器的
fixnum
值。当您使用编译为汇编的实现时,这会产生非常高效的代码,您可以使用
(反汇编(compile'add))
进行检查。例如,在Allegro CL中:

cl-user(10): (disassemble 'add)
;; disassembly of #<Function add>                                                                                                                                                                                                                 
;; formals: x y                                                                                                                                                                                                                                   

;; code start: #x10008ae4740:                                                                                                                                                                                                                     
   0: 48 01 f7       addq       rdi,rsi
   3: f8             clc
   4: 4c 8b 74 24 10 movq       r14,[rsp+16]
   9: c3             ret
cl用户(10):(反汇编添加)
;; #的拆卸
;; 形式:x-y
;; 代码开始:#x10008ae4740:
0:48 01 f7 addq rdi,rsi
3:f8 clc
4:4c 8b 74 24 10 movq r14[rsp+16]
9:c3 ret
但是,这种更快的代码是以不进行任何错误检查为代价的:代码假定您传入2个
fixnum
参数,不多也不少,并且您还保证结果不会溢出
fixnum
范围-因此,例如
(add most positive fixnum most positive fixnum)

如果您通过传递诸如
(add 3.4 1.2)
或仅arg
(add 3)
之类的浮点值来打破这一承诺,那么您就是在自找麻烦-这可能会损坏数据结构,甚至退出Lisp


第二个函数可以调用
%add-2-fixnums
,以表示它是特殊的,不是用于一般用途,而是专门用于某些参数,调用者需要非常小心。

没有
%
的函数是某些功能的通用接口,甚至可以检查其参数。然后调用一个低级实现

因此,前缀为
%
的同一函数可以有效地实现该功能,即使是以特定于平台的方式

如果此函数随后使用宏生成更具体的低级代码,则可以在宏前面加上
%%

这些其他情况也可以看到:

  • 类型特定功能
  • 内联函数
  • 具体实施职能
  • 在Lisp实现级别附近工作的非常低级的代码
  • Lisp汇编函数(内联汇编程序中编写的函数)
示例:例如,如果检查Clozure Common Lisp的源代码,就会发现大量使用了
%
命名约定