Lisp:在宏中扩展属性名称
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lisp:在宏中扩展属性名称相关的知识,希望对你有一定的参考价值。
考虑这个属性列表:
(defvar *some-variable* (list :foo "fooval" :bar "barval"))
这个简单的电话:
(getf *some-variable* :foo)
按预期收益"fooval"
。我定义了一个宏应该做同样的事情,除了我可以传递任何属性的名称来检索:
(defmacro my-macro (property-name)
`(getf *some-variable* :,property-name))
不幸的是,这样称呼它:
(my-macro 'foo)
结果在FOO
。为什么?
答案
你为什么不亲自检查一下:
(macroexpand-1 '(my-macro 'foo))
; ==> (getf *some-variable* :|| 'foo) ;
T
documentation for getf
说,如果你给它一个第四个参数,它是找不到密钥时的值。由于:||
(关键字包中的空符号)不存在,因此返回提供的默认foo
。
所以这是一个能够做你想要的功能:
(defun get-field (name)
(getf *some-variable*
(intern (symbol-name name) "KEYWORD")))
(defparameter *test* 'foo)
(get-field *test*)
; ==> "fooval"
使其成为宏的唯一原因是使其成为语法,语法和函数之间的主要区别在于不评估参数。
(defmacro get-mfield (name)
`(get-field ',name))
(get-mfield foo)
; ==> "fooval"
(get-mfield *test*)
; ==> nil
你得到文字裸露,但你失去了*test*
被视为变量而不是关键:*test*
的特征
以上是关于Lisp:在宏中扩展属性名称的主要内容,如果未能解决你的问题,请参考以下文章