指示符只不过是指定另一个对象的对象。他们的语言没有什么特别之处。指示符的概念只是使某些编程实践更容易的概念。词汇表说:
designatorn。表示另一个对象的对象。在里面
如果参数被描述为一个运算符的字典条目
类型的指示符,操作符的描述写在
假设对该类型的适当强制已经
发生了;也就是说,参数已经是指定的类型。
更多详细信息,请参阅Section 1.4.1.5 (Designators)。
该部分的链接很有帮助:
指示符是表示另一个对象的对象。
如果运算符的参数被描述为指示符,则
操作员的描述是以一种假设的方式编写的
参数的值是表示的对象;也就是说,
参数已经是指定的类型。 (具体的性质
由“«类型»指示符”或“用于
«type»”可以在“«type»指示符的词汇表条目中找到。”)
能够在词汇表中查找内容会有所帮助。例如,字符串指示符是可以代表字符串的东西:
string designatorn。字符串的指示符;也就是说,一个
表示字符串的对象,它是以下之一:一个字符(表示
以字符为唯一元素的单例字符串),
符号(表示作为其名称的字符串)或字符串(表示
本身)。意图是该术语与行为一致
字符串;扩展字符串的实现必须扩展含义
以兼容的方式使用该术语。
标准也恰好定义了函数string,它获取由字符串指示符指定的字符串:
返回一个由 x 描述的字符串;具体来说:
- 如果 x 是字符串,则返回它。
- 如果 x 是符号,则返回其名称。
- 如果 x 是一个字符,则返回一个包含该字符的字符串。 string 可能会执行额外的,实现定义的
转化。
这简化了必须处理字符串和类似字符串的函数的实现。例如,您可以定义一个 make-person 函数接受一个字符串指示符:
(defun make-person (name)
"Return a person with the name designated by NAME."
(list :name (string name)))
(defun person-name (person)
"Return the name of a person (a string)."
(getf person :name))
指示符的概念只不过是一种编程约定,它使定义灵活的 API 变得更加容易。 Common Lisp 被定义为一种将现有 Lisp 联合起来的语言,它可能是统一不同实现行为的更简单方法之一。
case 中使用了列表指示符的概念
list designatorn。对象列表的指示符;那是,
一个表示列表的对象,它是以下之一:非零原子
(表示一个单例列表,其元素是那个非零原子)或
正确的列表(表示它自己)。
case keyform {normal-clause}* [otherwise-clause] => result*
normal-clause::= (keys form*)
keys——对象列表的指示符。情况下,
符号 t 和其他符号不得用作键指示符。到
将这些符号本身称为键、代号 (t) 和
(否则)必须分别使用。
我不知道返回由列表指示符指定的列表的函数,但它很容易编写(这不处理 t 和 的特殊行为,否则 case 需要,但它通常处理列表指示符):
(defun to-list (x)
"Return the list designated by x."
(if (listp x) x
(list x)))
此类约定有时在您自己的代码中很有用,尤其是在您定义事物时存在事物的“注册表”时。例如,如果您写过以下任何一种:
(defmacro deftransform (name &rest args)
`(setf (gethash ',name *transforms*)
(make-transform ,@args)))
(defmacro deftransform (name &rest args)
(setf (get ',name 'transform) (make-transform ,@args)))
然后您可以将变换指示符的概念定义为变换对象或符号(它指定 *transforms* 表中符号的值,或符号上变换属性的值)。例如:
(defun transform (x)
(if (transformp x) x
(gethash name *transforms*)))
(defun transform (x)
(if (transformp x) x
(get x 'transform)))
这可能会使您的部分代码更易于使用。函数指示符类似