在宏中构建符号时处理可读的情况
deal with readtable case when building symbols inside a macro
我想构建一个定义多个 类 的宏和基于具有根字符串的符号的方法(我想这在 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 系统使用的 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' 符号解析器,它还会检查可读大小写。
我想构建一个定义多个 类 的宏和基于具有根字符串的符号的方法(我想这在 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 系统使用的 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' 符号解析器,它还会检查可读大小写。