gpt4 book ai didi

macros - 定义 Lisp 宏时是否使用双反引号(双逗号)?

转载 作者:太空宇宙 更新时间:2023-11-03 18:45:49 24 4
gpt4 key购买 nike

当一个人定义一个使用 macrolet 的宏,或定义一个定义宏的宏时,似乎有人使用 ,',, 来取消引用。有没有我需要使用 ,, 的情况?

最佳答案

当然可以。

这里是 code来自 Graham's "On Lisp" :

(defmacro =defun (name parms &body body)
(let ((f (intern (concatenate 'string
"=" (symbol-name name)))))
`(progn
(defmacro ,name ,parms
`(,',f *cont* ,,@parms))
(defun ,f (*cont* ,@parms) ,@body))))

另一个例子来自clx/gcontext.lisp:

(macrolet ((def-gc-internals (name &rest extras)
(let ((macros nil)
(indexes nil)
(masks nil)
(index 0))
(dolist (name *gcontext-components*)
(push `(defmacro ,(xintern 'gcontext-internal- name) (state)
`(svref ,state ,,index))
macros)
(setf (getf indexes name) index)
(push (ash 1 index) masks)
(incf index))
(dolist (extra extras)
(push `(defmacro ,(xintern 'gcontext-internal- (first extra)) (state)
`(svref ,state ,,index))
macros)
;; don't override already correct index entries
(unless (or (getf indexes (second extra)) (getf indexes (first extra)))
(setf (getf indexes (or (second extra) (first extra))) index))
(push (logior (ash 1 index)
(if (second extra)
(ash 1 (position (second extra) *gcontext-components*))
0))
masks)
(incf index))
`(within-definition (def-gc-internals ,name)
,@(nreverse macros)
(eval-when (:execute :compile-toplevel :load-toplevel)
(defparameter *gcontext-data-length* ,index)
(defparameter *gcontext-indexes* ',indexes)
(defparameter *gcontext-masks*
',(coerce (nreverse masks) 'simple-vector)))))))
(def-gc-internals ignore
(:clip :clip-mask) (:dash :dashes) (:font-obj :font) (:timestamp)))

简而言之,这不是很常见,但并非闻所未闻。

关于macros - 定义 Lisp 宏时是否使用双反引号(双逗号)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17938242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com