Lisp的%变量命名规范

3
https://www.cliki.net/Naming+conventions页面中我读到:

foo的低级、快速、危险函数,或Lisp系统特定实现

能否有人再次翻译并举例说明这些上下文是什么意思?

2个回答

8

请看此函数:

(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值的函数。当您使用编译成汇编的实现时,这会产生非常高效的代码,您可以使用(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

然而,这种更快的代码的代价是没有任何错误检查:该代码假设您传递了2个fixnum参数,不多不少,并且您承诺结果不会超出fixnum范围,因此不会有例如(add most-positive-fixnum most-positive-fixnum)的情况。
如果您违反此承诺,例如传递像(add 3.4 1.2)或仅一个arg像(add 3)的浮点数,则可能会导致大问题-这可能会破坏数据结构甚至退出Lisp。
第二个函数可以称为%add-2-fixnums以表示它很特殊,不适用于一般用途,而是专门针对某些参数进行了优化,调用者需要非常小心。

4
没有带有 % 的函数是某些功能通用接口,甚至可以检查其参数。然后,它会调用底层实现。
带有前缀 % 的同一函数可能会以高效的方式实现功能,甚至以平台特定的方式实现。
如果该函数使用宏来生成更具体的低级代码,则可能会使用 %% 前缀。
还有其他情况,例如:
- 类型特定函数 - 内联函数 - 实现特定函数 - 在 Lisp 实现级别附近工作的非常低级别的代码 - Lisp 汇编函数(在内联汇编器中编写的函数)
例如:如果您检查 Clozure Common Lisp 的源代码,则会发现有很多使用 % 命名约定的情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接