Lisp%var命名约定

3 naming-conventions common-lisp

https://www.cliki.net/Naming+conventions页面上,我阅读了

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

有人可以再举例说明这些情况吗?

zut*_*zut 8

使用此功能:

(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来表明它的特殊性,而不是旨在用于一般用途,而是专门用于某些参数,并且调用者需要非常小心。