2017-08-02 167 views
0

我正试图在Emacs Lisp上创建一个宏,我正在努力查看用户是否可以传递符号引用或不引用的符号。有没有办法检查符号是否被引用?

其实我需要类似quote-only-if-is-not-quoted宏。有没有这样的事情?我对Lisp方言没有发现任何关于此的信息。宏示例:

(quote-only-if-is-not-quoted 'q) => (quote q) 
(quote-only-if-is-not-quoted q) => (quote q) 

在此先感谢。

+3

“是否引用符号”的概念是相当无意义的,因为“引用”不是一个概念。 'quote',当被评估为特殊形式时,禁止评估数据。它没有任何其他特殊含义,对于elisp宏,“引用”符号仅仅是一个包含两个符号的列表,其中第一个符号是“quote”。没有更多的上下文,对于我想要解决什么问题,我感到非常困惑。 –

+0

对,谢谢你的回答。我正在试图使[宏](https://gist.github.com/ryukinix/f8b2231d1f2e3e8b95e4bb3312be5370)以两种方式工作:(when-system linux ...)和(when-system'linux ...)。换句话说,我希望第一个参数只有在不作为带引号的符号传递时才可以引用。但是,按照你确实回答的方式,现在我认为这是不可能的。 –

回答

2

宏参数是未评估,所以是的,你可以检查是否引用了一个参数,如果没有,引用它。像这样?

(defmacro quote-only-if-is-not-quoted (arg) 
    (if (and (consp arg) 
      (eq (car arg) 'quote)) 
     arg 
    `(quote ,arg))) 
+0

没错!谢谢! –

相关问题