首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指示符的性质是什么?

指示符的性质是什么?
EN

Stack Overflow用户
提问于 2014-12-11 16:38:50
回答 3查看 913关注 0票数 5

Svante在另一个答案中显示字符串指示符,这让我大吃一惊:

代码语言:javascript
复制
(string= :& "&") -> T

看看CLHS,他们说A designator is an object that denotes another object.很好,但是由于这些是不同的对象,所以需要在某个地方进行某种强制。我的意思是,如果下面的列表指示符可以由‘非零原子’来满足,那么某些逻辑就存在于处理这个问题的某个地方。

列表指示符n.对象列表的指示符;即表示列表的对象,它是:非零原子(表示元素为非零原子的单例列表)或适当的列表(表示其本身)。

我认为命名器只是一个概念,例如,泛型函数..。但下面是CLHS的台词..。

除非另有说明,在表示对象可能被多次使用的情况下,它取决于对象是否仅被胁迫一次,或者每次必须使用对象时是否发生强制。

..。使之看起来很具体。

所以我的问题

  • 如何在实现中实现指示符的示例是什么?
  • 这种机制是否可以被用户以任何方式扩展?
  • 这种机制在不同的指标符之间是否一致?(从clhs看,似乎有18种代号)

干杯

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-11 19:10:04

指示符只不过是一个指定另一个对象的对象。它们的语言没有什么特别之处;命名器的概念只是使某些编程实践变得更容易的概念。术语表上说:

代号 n.表示另一个对象的对象。在操作符的字典条目中,如果参数被描述为类型的指示符,则对运算符的描述是以假定已经发生了对该类型的适当强制的方式编写的;也就是说,该参数已经是所表示的类型。有关更多详细信息,请参见第1.4.1.5节(设计人员)

指向该部分的链接很有帮助:

1.4.1.5设计人员 指示符是表示另一个对象的对象。 如果将运算符的参数描述为指示符,则运算符的描述将以假定参数的值是已表示的对象的方式编写;也就是说,参数已经是所表示的类型。(由“type”指示符或“类型指示符”表示的对象的特定性质可以在“type”的Glossary条目中找到。)

能够在词汇表中查找有用的东西。例如,字符串指示符可以代表字符串:

字符串指示符 n.一个字符串的指示符;也就是说,一个表示字符串的对象,它是一个字符(表示将字符作为其唯一元素的单个字符串)、一个符号(表示其名称的字符串)或一个字符串(表示其本身)。其意图是该术语与字符串的行为一致;扩展字符串的实现必须以兼容的方式扩展该术语的含义。

该标准还碰巧定义了函数字符串,该函数获取由字符串指示符指定的字符串:

返回由x描述的字符串;特别是:

  • 如果x是字符串,则返回它。
  • 如果x是符号,则返回其名称。
  • 如果x是一个字符,则返回一个包含该字符的字符串。字符串可以执行额外的、实现定义的转换。

这简化了必须使用字符串和字符串之类的东西的函数的实现。例如,您可以定义一个make-person函数,该函数接受一个字符串指示符:

代码语言:javascript
复制
(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变得更容易。公共Lisp被定义为一种语言,用于统一一组现有的Lisp,并且它可能是统一不同实现的行为的更容易的方法之一。

案例中有一个列表指示符的概念

列表指示符 n.对象列表的指示符;即表示列表的对象,它是:非零原子(表示元素为非零原子的单例列表)或适当的列表(表示自身)。

案例键格式{正规-子句}*否则-子句=>结果* 常规-子句::=(键形式*) 键-对象列表的标识符。在这种情况下,符号t和其他符号不能用作键指示符。若要将这些符号本身称为键,则必须分别使用指示符(t)和(否则)。

我不知道有一个函数返回列表指示符指定的列表,但是编写起来非常容易(这不能处理t的特殊行为,否则case需要其他的,但它通常处理列表指示符):

代码语言:javascript
复制
(defun to-list (x)
  "Return the list designated by x."
  (if (listp x) x
    (list x)))

这样的约定有时会在您自己的代码中很有用,特别是当您定义有“注册中心”的东西的时候。例如,如果你写过以下任何一篇文章:

代码语言:javascript
复制
(defmacro deftransform (name &rest args)
  `(setf (gethash ',name *transforms*)
         (make-transform ,@args)))

代码语言:javascript
复制
(defmacro deftransform (name &rest args)
  (setf (get ',name 'transform) (make-transform ,@args)))

然后,您可以将转换指示符的概念定义为转换对象或符号(它在*transforms*表中指定符号的值,或符号上的transform属性值)。例如:

代码语言:javascript
复制
(defun transform (x)
  (if (transformp x) x
    (gethash name *transforms*)))

代码语言:javascript
复制
(defun transform (x)
  (if (transformp x) x
    (get x 'transform)))

这可能会使代码的部分更易于使用。函数指示符相似。

票数 7
EN

Stack Overflow用户

发布于 2014-12-11 17:20:22

什么

对象的指示符不一定是对象,但可以从中推断对象。任何物体都会以琐碎的方式标明自己。

例如,character不是a的(子类型) string,但有时可以使用character代替string,因为它表示一个单字符字符串。

如何:系统级

实现会做不同的事情,查看它们各自的源代码。您可以在下面找到类似于使用级代码之类的东西。

代码语言:javascript
复制
(defun human-address (human)
  (etypecase human
    (human ...)
    (string (human-address (gethash human *humanity*)))))

甚至是

代码语言:javascript
复制
(defun human-address (human)
  (when (stringp human)
    (setq human (gethash human *humanity*)))
  (unless (human-p human)
    (error ...))
  ...)

如果defgeneric由于引导问题而不可用,或者作为优化而被避免。

如何:用户级别

系统级指示符不是用户可扩展的.也就是说,您不能定义您自己的包或字符串指示符。

但是,您可以为自己的类型定义自己的标识符,例如:

代码语言:javascript
复制
(defclass human ...)
(defvar *humanity* (make-hash-table ...))
(defgeneric human-address (human)
  (:method ((human human))
     ...)
  (:method ((name string))
    (human-address (gethash name *humanity*))))

在这里,string充当human的指示符。

票数 4
EN

Stack Overflow用户

发布于 2014-12-17 10:39:48

对象指示符通常包括多种类型的对象来表示或命名预期的对象。

良好的指示符定义不包括nil (即允许而不是指定对象),有不相交的指示符类型,而且这些指示符通常是指向目标的名称或对象。

注意:在我看来,指示符是不必要的快捷方式,在使用REPL或原型时非常有用。

以下是非详尽的主观分类指示符列表。

良好的指示符(本质上,非零,命名或容器,指示符):

  • 字符指示符
  • 类指示符
  • 扩展功能指示符
  • 文件位置指示符
  • 功能指示符
  • 逻辑主机指示符

不太好的代号:

  • 外部文件格式指示符 它的定义是有意开放的,并且与实现相关,所以要由实现来定义好的指示符。除此之外,没关系。
  • 包装指示符 其定义基于字符串指示符。除此之外,没关系。
  • 路径名称指示符 我对此有着复杂的感觉,主要是因为流不是可靠的路径名指示符。只有文件流和此类流的同义词流才是。 对于可以接受流或打开流本身的给定函数,有时传递一个已经打开的流来读取或写入,或者任由它打开,有时传递要在with-open-file (或类似的)中使用的路径名是有用的,因此这里的汇合点丢失了。 但是,这样的函数可能应该分为两个部分,一个显式地接受流指示符,另一个显式地接受路径名指示符。
  • 字符串指示符 字符串包含一个字符,而不是相反。但是,单例字符串可以用它的单个字符命名,所以我想这还不算太糟。 这个指示符不好的一个特殊情况是破坏性操作,它只需要实际的字符串。这是意料之中的,但这是一个您必须知道的细节,例如,如果您从string-upcase切换到nstring-upcase

错误的代号:

  • 列表指示符 您必须知道,没有(nil)的标识符。
  • 可读指示符 nil代表标准可读性,您不能而不是指定可读的。否则,不显眼的nil不会发出错误信号。
  • 流指示符 nil用作上下文敏感的指示符,在这种情况下不能而不是指定流。否则,不显眼的nil不会发出错误信号。
  • 流变量指示符 与流指示符相同的原因。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27427925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档