Common lisp Lisp%var命名约定
在我读的那一页里 foo的低级、快速、危险功能或特定于Lisp系统的实现 有人能用这些上下文的一个例子把这句话再翻译一遍吗 使用此功能: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
(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汇编函数(内联汇编程序中编写的函数)
%
命名约定