gpt4 book ai didi

macros - 通用 Lisp : Passing Symbol to Macro

转载 作者:行者123 更新时间:2023-12-01 22:57:00 26 4
gpt4 key购买 nike

此宏的目的是创建一个宏,该宏为访问关联列表的某个键提供名称。

(defmacro generate-accessor (key-symbol prefix)
(let ((mac-name
(intern (string-upcase (concatenate 'string
prefix "-"
(string key-symbol))))))
`(defmacro ,mac-name (alis) `(assoc ,',key-symbol ,alis))))

所以当我尝试的时候——
CL-USER> (generate-accessor 'a "alist")
; ERROR> 'A cannot be coerced to a string.

但是...
CL-USER> (string 'a)
; RESULT> "A"

所以我再次尝试使用 SYMBOL-NAME 将符号强制转换为字符串
(defmacro generate-accessor (key-symbol prefix)
(let ((mac-name
(intern (string-upcase (concatenate 'string
prefix "-"
(symbol-name key-symbol))))))
`(defmacro ,mac-name (alis) `(assoc ,',key-symbol ,alis))))

这次当我试一试时——
CL-USER> (generate-accessor 'a "alist")
; ERROR> The value 'A is not of type SYMBOL.

但是...
CL-USER> (symbol-name 'a)
; RESULT>"A"
CL-USER> (symbolp 'a)
; RESULT>T

每当我使用 'a在我的宏之外,它会像我期望的那样自 Action 为一个符号进行实习。然而不知何故,当我通过时 'a对于我的宏,它以引用块的形式出现。我不明白为什么没有对其进行评估,尤其是在反引号开始之前的某个时间点。我知道我不了解 Lisp 的一些基本知识,但我现在不知道如何看待它。

最佳答案

'a(quote a) 的简写,这是您传递给宏的列表。宏参数不被评估,而是按原样传递。当用作函数的参数时(即,不是宏)(quote a)先求值,求值结果(quote a)是符号a .例如,考虑之间的差异

(list 'a)           ===
(list (quote a))
; => (a)


'('a)               ===
'((quote a)) ===
(quote ((quote a)))
; => ((quote a)) ;; which may also be printed ('a)

将符号参数用于宏的示例

根据评论中的请求,这里是 defstruct -like 宏,它创建一些包含结构名称的函数。
(defmacro my-defstruct (name slot)
"A very poor implementation of defstruct for structures
that have exactly one slot"
(let ((struct-name (string name))
(slot-name (string slot)))
`(progn
(defun ,(intern (concatenate 'string (string '#:make-) struct-name)) (value)
(list value))
(defun ,(intern (concatenate 'string (string struct-name) "-" slot-name)) (structure)
(car structure)))))

这是什么,例如, (my-defstruct foo bar)扩展为:
CL-USER> (pprint (macroexpand '(my-defstruct foo bar)))

(PROGN
(DEFUN MAKE-FOO (VALUE) (LIST VALUE))
(DEFUN FOO-BAR (STRUCTURE) (CAR STRUCTURE)))

使用示例:
CL-USER> (my-defstruct foo bar)
FOO-BAR
CL-USER> (make-foo 34)
(34)
CL-USER> (foo-bar (make-foo 34))
34

关于macros - 通用 Lisp : Passing Symbol to Macro,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17871121/

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