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



我想构建一个宏,它基于具有根字符串的符号定义多个类和方法(我想这在 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缺少一个标准的符号解析器,它只在隔离的情况下进行该操作 - 没有读取时间评估,也没有读取任意结构。库中的某个地方可能有一个"安全"的符号解析器,它也检查可读的情况。

相关内容

  • 没有找到相关文章

最新更新