ELisp宏按参数类型差异化展开:可行性与最佳实践探讨
ELisp宏根据参数类型差异化展开的可行性与最佳实践
我想了解:编写可根据参数是常量还是符号进行不同展开的ELisp宏是否可行?这是否属于最佳实践?
以下是Emacs 30.0.50中的示例代码:
(defmacro list-length (x) (cond (`(symbolp ,x) `(eval (length ,x))) (t (length x))))
预期的两种展开方式如下:
- 当参数为符号时:
(let ((x (list 1 2 3 4 5))) (macroexpand '(list-length x))) => (eval (length x))
- 当参数为常量列表时:
(macroexpand '(list-length (1 2 3 4))) => 4
我的实际需求是:若宏参数可在展开时确定,则展开为多个puthash调用;否则展开为cl-loop来处理运行时传入的列表。但我对“展开时可确定”的具体定义感到困惑——判断标准是symbolp?boundp?还是有其他更合适的方式?
内容的提问来源于stack exchange,提问作者neal
相关产品推荐
相关产品推荐

