Macros 哪里是';a1和x27;从《让Lambda过去》这本书里找到的?
Doug Hoyte的书《让过Lambda》描述了通过以下方式对固定大小输入进行快速排序的功能: 表达式(car a1)和(cadr a1)中的符号“a1”来自何处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
顺便说一句,“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))