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

Common lisp 在宏中构建符号时处理可读的情况,common-lisp,symbols,case-sensitive,reader,Common Lisp,Symbols,Case Sensitive,Reader,我想构建一个宏,它基于具有根字符串的符号定义几个类和方法(我想这在lisp^^中并不少见) 虚拟示例: (定义我的东西(术语) 会做这样的事情 declass我的超级学期类 defvar*术语变量* defun do term((一个事物*示例term*) 使用基于“term”宏参数的符号 如何处理不同的可读大小写,以便代码可以普遍用于四种不同类型的大小写(:UPCASE:DOWNCASE:PRESERVE:INVERT) 我希望能够使用源代码中的这些符号,因此我希望宏中创建的符号由lisp

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

虚拟示例:
(定义我的东西(术语)
会做这样的事情

  • declass我的超级学期类
  • defvar*术语变量*
  • defun do term((一个事物*示例term*)

    使用基于“term”宏参数的符号
如何处理不同的可读大小写,以便代码可以普遍用于四种不同类型的大小写(:UPCASE:DOWNCASE:PRESERVE:INVERT)

我希望能够使用源代码中的这些符号,因此我希望宏中创建的符号由lisp系统使用的reader Readable case规则生成

(常规用法是:UPCASE,但有些用法是:DOWNCASE)

我发现做这种事情的唯一方法是使用
READ-FROM-STRING
函数(例如:(READ-FROM-STRING(连接“term”“-variable”)) 但这也会使符号产生副作用

那么,我应该如何按照可读大小写规则计算符号,而不将其插入内存?

在通用lisp软件包中是否有相应的函数?

您可以使用不需要的符号作为字符串指示符:

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

您可以创建不需要的符号:

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

但是,在尝试从不安全的字符串中安全读取时,您需要非常小心地使用
从字符串读取
。Common Lisp IIRC缺少一个标准的符号解析器,该解析器只单独执行该操作,没有读取时间求值,也没有读取任意结构。库中可能有一个“安全”符号解析器,它还检查可读取的大小写。

谢谢,但我不确定我是否理解这里的安全问题。据我所知,风险在于从字符串读取的结果的执行。因此,我决定不调用eval。