Macros 测试符号是否是宏中的哈希表

Macros 测试符号是否是宏中的哈希表,macros,common-lisp,Macros,Common Lisp,我想构建一个宏,它可以根据作为参数提供的符号类型扩展为不同的形式。一个小的可复制示例(其中两个,实际上……在sbcl和ccl上失败)如下所示: λ (defmacro what-am-i (a-thing) (etypecase a-thing (list `(format t "im a list")) (vector `(format t "im a vector")) (hash-table `(form

我想构建一个宏,它可以根据作为参数提供的符号类型扩展为不同的形式。一个小的可复制示例(其中两个,实际上……在sbcl和ccl上失败)如下所示:

λ (defmacro what-am-i (a-thing)
   (etypecase a-thing
        (list         `(format t "im a list"))
        (vector       `(format t "im a vector"))
        (hash-table   `(format t "im a hash-table"))))

λ (defmacro what-am-i2 (a-thing)
     (cond
        ((typep a-thing 'list)         `(format t "im a list"))
        ((typep a-thing 'vector)       `(format t "im a vector"))
        ((typep a-thing 'hash-table)   `(format t "im a hash-table"))))

λ (what-am-i '(1 2 3 4))
im a list
NIL

λ (what-am-i "abcd")
im a vector
NIL

λ (what-am-i *my-hash*)

debugger invoked on a SB-KERNEL:CASE-FAILURE in thread
#<THREAD "main thread" RUNNING {10039846F3}>:
  *MY-HASH* fell through ETYPECASE expression.
  Wanted one of (LIST VECTOR HASH-TABLE).

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.

(SB-KERNEL:CASE-FAILURE ETYPECASE *MY-HASH* (LIST VECTOR HASH-TABLE))
0] ^D

λ (what-am-i2 '(1 2 3 4))
im a list
NIL

λ (what-am-i2 "abcd")
im a vector
NIL

λ (what-am-i2 *my-hash*)

NIL
λ (typep *my-hash* 'hash-table)

T
λ(defmacro-am-i(a-thing)
(乙种酶a-thing)
(列表`(格式t“im a列表”))
(矢量`(格式t“im a矢量”))
(哈希表`(格式t“im a哈希表”))
λ(a-am-i2(a-thing)
(续)
((键入一个事物列表)`(格式为“我是一个列表”))
((typep a-thing'vector)`(格式t“ima-vector”))
((键入一个事物的“哈希表”)`(格式t“我是一个哈希表”))
λ(what-am-i’(1234))
我是一张名单
无
λ(what-am-i“abcd”)
我是矢量
无
λ(what-am-i*我的散列*)
在SB内核上调用的调试器:线程中的案例失败
#:
*MY-HASH*通过了ETYPECASE表达式。
想要一个(列表向量哈希表)。
键入“帮助”以获取调试器帮助,或键入(SB-EXT:EXIT)以退出SBCL。
重新启动(可通过数字或可能的缩写名称调用):
0:[中止]退出调试器,返回顶层。
(SB-KERNEL:CASE-FAILURE-ETYPECASE*MY-HASH*(列表向量哈希表))
0]^D
λ(what-am-i2’(1234))
我是一张名单
无
λ(what-am-i2“abcd”)
我是矢量
无
λ(what-am-i2*我的散列*)
无
λ(typep*my hash*'哈希表)
T
谁能告诉我我做错了什么吗?

符号的类型总是
symbol
:-)

在执行(计算)代码之前,符号值的类型是未知的

因此,
(what-am-i'(1234))
看到一个列表
(quote(1234))
并报告它是一个列表,而
(what-am-i*我的散列*)
看到一个符号
*我的散列*
并报告一个错误

您可以使用
symbol value
在宏展开时访问符号的全局值,但我怀疑您在这里问的问题是错误的

我建议你问一个单独的问题,解释你真正想要完成的事情。

符号的类型总是
symbol
:-)

在执行(计算)代码之前,符号值的类型是未知的

因此,
(what-am-i'(1234))
看到一个列表
(quote(1234))
并报告它是一个列表,而
(what-am-i*我的散列*)
看到一个符号
*我的散列*
并报告一个错误

您可以使用
symbol value
在宏展开时访问符号的全局值,但我怀疑您在这里问的问题是错误的


我建议你问一个单独的问题,解释一下你真正想要完成的事情。

这个答案相当于对它的总结。有一些类型可以在编译时检测到(例如,文字列表或向量),有时人们会编写编译器宏,这些宏将扩展为特定类型的形式。我理解这种方法是针对文字和常量的,但不是针对变量的。这个答案大致概括了这一点。有一些类型可以在编译时检测到(例如,文字列表或向量),有时人们会编写编译器宏,将其扩展为特定类型的形式。我理解这种方法是针对文字和常量的,而不是针对变量的。