3 naming-conventions common-lisp
在https://www.cliki.net/Naming+conventions页面上,我阅读了
低级,快速,危险功能或Lisp系统特定的foo实现
有人可以再举例说明这些情况吗?
使用此功能:
(defun add (x y)
(+ x y))
Run Code Online (Sandbox Code Playgroud)
进行一般加法。它支持整数,浮点数,复数和比率作为参数-Lisp中定义的所有数字类型。
但是,如果您有:
(defun add (x y)
(declare (fixnum x y) (optimize speed (safety 0) (debug 0)))
(the fixnum (+ x y)))
Run Code Online (Sandbox Code Playgroud)
这告诉编译器针对fixnum装配汇编寄存器中的值优化函数。当您使用编译为汇编的实现时,这会产生非常有效的代码,您可以使用进行检查(disassemble (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
Run Code Online (Sandbox Code Playgroud)
但是,这种更快的代码是以不进行任何错误检查为代价的:该代码假定您传入fixnum或传入了两个或多或少的参数,并且您保证结果不会溢出fixnum范围-例如,不会(add most-positive-fixnum most-positive-fixnum)。
如果通过传递浮点数(例如(add 3.4 1.2)arg)或仅传递arg来违背这一诺言,(add 3)那么您将遇到大麻烦-这可能会破坏数据结构,甚至退出Lisp。
可以调用第二个函数%add-2-fixnums来表明它的特殊性,而不是旨在用于一般用途,而是专门用于某些参数,并且调用者需要非常小心。