我想构建一个宏,它基于具有根字符串的符号定义多个类和方法(我想这在 lisp ^^ 中并不罕见(。
虚拟示例:(defmacro define-my-stuff (term)
会做这样的事情
defclass my-super-term-class
defvar *term-variable*
-
使用基于"term"宏参数构建的符号进行defun do-term ((a-thing *example-term*))
如何处理不同的可读案例,以便代码可以普遍用于四种不同类型的案例(:UPCASE :D OWNCASE :P RESERVE :INVERT(。
我希望能够从源代码中使用这些符号。因此,我希望在宏中创建的符号由 lisp 系统使用的读取器可读大小写规则构建。
(常规是:UPCASE,但有些使用:D例如OWNCASE(。
我发现做这样的事情的唯一方法是使用READ-FROM-STRING
函数(示例:(从字符串读取(连接"term"-variable"(( 但这也使该符号成为副作用。
那么我应该如何按照可读大小写规则计算一个符号而不中止它呢?
在 common-lisp 包中是否有该功能?
您可以使用未被限制的符号作为字符串指示符:
(string '#:Foo)
=> "FOO"
or=> "foo"
or=> "Foo"
or=> "fOO"
您可以创建一个未被限制的符号:
(read-from-string (concatenate 'string "#:" "term" "-variable")
但是,在尝试从不安全的字符串中安全地读取时,您需要非常小心READ-FROM-STRING
。Common Lisp IIRC缺少一个标准的符号解析器,它只在隔离的情况下进行该操作 - 没有读取时间评估,也没有读取任意结构。库中的某个地方可能有一个"安全"的符号解析器,它也检查可读的情况。