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

标签 common-lisp symbols 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 以便代码可以普遍用于四种不同类型的情况 (:UPCASE :DOWNCASE :PRESERVE :INVERT)。

我希望能够从源代码中使用这些符号。所以我希望在宏中创建的符号由 lisp 系统使用的读者可读大小写规则构建。

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

我发现做这样的事情的唯一方法是使用 READ-FROM-STRING 函数(例如:(read-from-string(连接“term”“-variable” )) 但这也会将符号实习为副作用。

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

最佳答案

您可以使用一个未实习的符号作为字符串指示符:

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

关于common-lisp - 在宏中构建符号时处理可读的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59090327/

相关文章:

Powershell 如果 -eq 和 -ieq 不区分大小写并且具有相同的用途,或者 -ieq 需要在特定场景中使用?

lisp - 两个简单的推送功能;一个永久改变全局变量,另一个不改变,为什么?

common-lisp - 使用 Steel Bank Common Lisp 运行 utf-8 编码的脚本

macros - 有没有办法混合 LISP 的宏 &optional 和 &key 参数?

c - x86_64 Linux 上定义的 ioctl 系统调用的用户空间包装器在哪里?

sql - 不区分大小写的架构对象名称,带有区分大小写的比较

function - LISP,条件每次都返回零

c++ - LNK2019 : Unresolved symbol

iphone - 如何将 HTML 代码更改为符号 iphone

PHP 数组,数组索引区分大小写吗?