在宏中构建符号时处理可读的情况

deal with readtable case when building symbols inside a macro

我想构建一个定义多个 类 的宏和基于具有根字符串的符号的方法(我想这在 lisp 中并不罕见 ^^)。

虚拟示例: (defmacro define-my-stuff (term) 会做

这样的事情

如何处理不同的 readtable-case 以便代码可以普遍用于四种不同类型的情况 (:UPCASE :DOWNCASE :PRESERVE :INVERT)。

我希望能够从源代码中使用这些符号。所以我希望在宏中创建的符号由 lisp 系统使用的 reader readtable-case 规则构建。

(常规是 :UPCASE 但有些使用 :DOWNCASE 例如)。

我发现做这种事情的唯一方法是使用 READ-FROM-STRING 函数(示例:(从字符串读取(连接 "term" "-variable")) 但这也将符号实习为副作用。

那么我应该如何计算遵循 readtable-case 规则的符号而不对其进行驻留?
在 common-lisp 包中有这个功能吗?

您可以使用未固定符号作为字符串指示符:

(string '#:Foo)
=> "FOO"
or=> "foo"
or=> "Foo"
or=> "fOO"

您可以创建一个 uninterned 符号:

(read-from-string (concatenate 'string "#:" "term" "-variable")

但是在尝试安全地读取不安全的字符串时,您需要非常小心 READ-FROM-STRING。 Common Lisp IIRC 缺少一个标准的符号解析器,它只能独立地执行该操作——没有读取时间评估,也没有读取任意结构。某个库中可能有一个 'secure' 符号解析器,它还会检查可读大小写。