gpt4 book ai didi

struct - 如何为 defstruct 的递归 "slot-value"编写宏?

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

问题:如何为析构(以及实例)的嵌套槽值编写通用访问器宏?

动机:我是一名 LISP 程序员,羡慕 Python 等中的“点符号”,其中嵌套槽访问距离只有几个点

用例:我想做的是

(print (?? obj a b c) 
; i.e. ((print (slot-value (slot-value (slot-value obj 'a) 'b ) 'c))
(setf (?? obj a b c) newValue)

当前结果(不好):我能做的最好是一些嵌套的 defun(见下文)。这种方法有局限性:

  • 那些运行运行时,理想情况下,所有嵌套访问器工作都在加载时发生。
  • 我必须为 getset 编写单独的函数,而如果我能破解 setf 宏扩展问题,那么只有需要一个get

我当前的代码:(任何人都可以用单个 defmacro 替换它吗?)

(defun rslots-get (o l)
(if (cdr l)
(rslots-get (slot-value o (car l)) (cdr l))
(slot-value o (car l))))

(defun rslots-set (o l z)
(setf
(slot-value o (car l))
(if (cdr l)
(rslots-set (slot-value o (car l)) (cdr l) z)
z))
o)

(defun rslots-push (o l z)
(setf
(slot-value o (car l))
(if (cdr l)
(rslots-push (slot-value o (car l)) (cdr l) z)
(push z (slot-value o (car l)))))
o)

(defmacro ?? (o &rest l) `(rslots-get ,o ',l ))
(defmacro !! (o z &rest l) `(rslots-set ,o ',l ,z))
(defmacro << (o z &rest l) `(rslots-push ,o ',l ,z))

ADVAthanxNCE!

最佳答案

您可以使用递归宏。基本情况是单个参数,它简单地转换为对 slot-value 的调用。否则它会递归调用自身,只使用额外的槽。

(defmacro ?? (obj first-slot &rest more-slots)
(if (null more-slots)
`(slot-value ,obj ',first-slot)
`(?? (slot-value ,obj ',first-slot) ,@more-slots)))

关于struct - 如何为 defstruct 的递归 "slot-value"编写宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46982105/

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