宏内部的宏创建一个 None 的列表

macro inside of macro creates a list of None

我定义了两个宏:

(defmacro property [name type]
  `(setv ^(of Optional ~type) ~name None))

(defmacro data-type [vname &rest propertys]
  `(with-decorator dataclass
    (defclass ~vname []
      ~propertys)))

调用时:

(data-type my-test-type
    (property name str)
    (property unitprice float)
    (property qty_on_hand int)
    (property test int))

并扩展并翻译成 python 它产生以下内容:

@dataclass
class my_test_type:
    name: Optional[str] = None
    unitprice: Optional[float] = None
    qty_on_hand: Optional[int] = None
    test: Optional[int] = None
    [None, None, None, None]

在没有嵌套宏的情况下编写它仍然会产生一个列表 None:

(data-type my-test-type
    (setv ^(of Optional str) name None
          ^(of Optional float) unitprice None
          ^(of Optional int) qty_on_hand None
          ^(of Optional int) test None))
@dataclass
class my_test_type:
    name: Optional[str] = None
    unitprice: Optional[float] = None
    qty_on_hand: Optional[int] = None
    test: Optional[int] = None
    [None]

这份 [None, None, None, None] 的列表来自哪里?虽然 none 的列表不会破坏任何东西,但它仍然有点刺耳,我希望我知道编写此宏以避免 None.

列表的更好方法是什么

看起来您写的是 ~propertys,但意思是 ~@propertys。您希望将每个 属性 声明拼接到 defclass 中,而不是将它们组合成一个列表。进行此更改会删除 None 的尾随列表。