Macros 哪里是';a1和x27;从《让Lambda过去》这本书里找到的?

Macros 哪里是';a1和x27;从《让Lambda过去》这本书里找到的?,macros,common-lisp,sorting-network,let-over-lambda,Macros,Common Lisp,Sorting Network,Let Over Lambda,Doug Hoyte的书《让过Lambda》描述了通过以下方式对固定大小输入进行快速排序的功能: 表达式(car a1)和(cadr a1)中的符号“a1”来自何处 顺便说一句,“defmacro!”是一个宏,用于定义引入“g!”!{symbol}语法,通过“gensym”创建新符号。“build batcher sn”使用生成一个函数。我发现这很奇怪,而且mapcar只接受一个函数,而let不符合条件。因此,必须有其他内容,\`是一个reader宏,它围绕以下表达式创建一个函数: '#`(li

Doug Hoyte的书《让过Lambda》描述了通过以下方式对固定大小输入进行快速排序的功能:

表达式(car a1)和(cadr a1)中的符号“a1”来自何处


顺便说一句,“defmacro!”是一个宏,用于定义引入“g!”!{symbol}语法,通过“gensym”创建新符号。“build batcher sn”使用生成一个函数。

我发现这很奇怪,而且
mapcar
只接受一个函数,而
let
不符合条件。因此,必须有其他内容,
\`
是一个reader宏,它围绕以下表达式创建一个函数:

'#`(list a b c) 
; ==> (lambda (a1) `(list a b c))
请注意,我引用了它,因为它是一个read宏,所以它仍然会展开,但结果会被引用。因此
a1
来自读卡器宏。以下是它的定义和激活:

(defun |#`-reader| (stream sub-char numarg)
  (declare (ignore sub-char))
  (unless numarg (setq numarg 1))
  `(lambda ,(loop for i from 1 to numarg
                  collect (symb 'a i))
     ,(funcall
        (get-macro-character #\`) stream nil)))

(set-dispatch-macro-character
  #\# #\` #'|#`-reader|)
以及有关守则:

'#`(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)))
; ==>
(lambda (a1)
 `(let ((,g!a ,(nth (car a1) places)) 
        (,g!b ,(nth (cadr a1) places)))
   (if (,comperator ,g!b ,g!a) 
       (setf ,(nth (car a1) places) ,g!b ,(nth (cadr a1) places) ,g!a))))
要使用更多参数,请在前面添加数字:

'#2`(list ,a1 ,a2)
; ==> (lambda (a1 a2) `(list ,a1 ,a2))

谢谢@Sylvester,我的平板电脑键盘没有回音。
'#2`(list ,a1 ,a2)
; ==> (lambda (a1 a2) `(list ,a1 ,a2))