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

Vin*_*inD 2 symbols common-lisp case-sensitive reader

我想构建一个宏,它根据具有根字符串的符号定义多个类和方法(我想这在 lisp ^^ 中并不是一件不寻常的事情)。

虚拟示例: (defmacro define-my-stuff (term) 会做这样的事情

  • defclass my-super-term-class
  • defvar *term-variable*
  • defun do-term ((a-thing *example-term*))
    使用基于“term”宏参数构建的符号

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

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

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

我发现做这样的事情的唯一方法是使用READ-FROM-STRING函数(例如:(从字符串读取(连接“术语”“-变量”))但这也将符号作为副作用实习。

那么我应该如何按照 readtable-case 规则计算一个符号而不实习呢?
在 common-lisp 包中是否有功能?

Sva*_*nte 5

您可以使用一个无间断的符号作为字符串指示符:

(string '#:Foo)
=> "FOO"
or=> "foo"
or=> "Foo"
or=> "fOO"
Run Code Online (Sandbox Code Playgroud)