Doug Hoyte 的“Let over Lambda”一书描述了一种通过排序网络对固定大小的输入进行快速排序的函数:
(defmacro! sortf (comperator &rest places)
(if places
`(tagbody
,@(mapcar
#`(let ((,g!a #1=,(nth (car a1) places))
(,g!b #2=,(nth (cadr a1) places)))
(if (,comperator ,g!b ,g!a)
(setf #1# ,g!b
#2# ,g!a)))
(build-batcher-sn (length places))))))
表达式“(car a1)”和“(cadr a1)”中的符号“a1”从何而来?
顺便提一句。“定义宏!” 是一个定义宏的宏,它引入了 'g!{symbol}' 语法以通过 'gensym' 创建一个新的符号。'build-batcher-sn'使用Batcher 算法构建排序网络。